Java中的代理模式是一种设计模式,它允许通过在对象之间添加一个代理对象来控制对对象的访问。代理对象可以在调用真实对象的方法前后添加一些额外的逻辑,例如日志记录、权限控制、性能监控等。
静态代理是在编译期就已经确定代理类和被代理类的关系。代理类是手动编写的,并且只为特定的被代理类服务。这种方式的优点是实现简单,容易理解;缺点是如果有多个被代理类,就需要编写大量重复的代理类代码。
动态代理是在运行时动态生成代理类。Java提供了java.lang.reflect.Proxy
类来支持动态代理。动态代理可以为多个不同的被代理类创建代理对象,只需要编写一个通用的InvocationHandler
。
动态代理的核心在于Proxy
类和InvocationHandler
接口。Proxy
类允许在运行时创建代理对象,而InvocationHandler
接口则定义了代理对象调用方法时的具体行为。
以下是一个简单的动态代理示例:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface UserService {
void addUser(String user);
void deleteUser(String user);
}
class UserServiceImpl implements UserService {
@Override
public void addUser(String user) {
System.out.println("Adding user: " + user);
}
@Override
public void deleteUser(String user) {
System.out.println("Deleting user: " + user);
}
}
class UserServiceInvocationHandler implements InvocationHandler {
private Object target;
public UserServiceInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method: " + method.getName());
Object result = method.invoke(target, args);
System.out.println("After method: " + method.getName());
return result;
}
}
public class ProxyDemo {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserServiceInvocationHandler handler = new UserServiceInvocationHandler(userService);
UserService proxy = (UserService) Proxy.newProxyInstance(
userService.getClass().getClassLoader(),
new Class[]{UserService.class},
handler
);
proxy.addUser("John Doe");
proxy.deleteUser("John Doe");
}
}
输出结果:
Before method: addUser
Adding user: John Doe
After method: addUser
Before method: deleteUser
Deleting user: John Doe
After method: deleteUser
通过上述示例可以看出,动态代理使得我们可以在运行时动态地为对象添加功能,而无需修改原始类的代码,这大大提高了代码的灵活性和可维护性。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。