Java中的代理模式是一种常见的设计模式,它允许通过代理对象来控制对目标对象的访问。代理模式可以在不修改目标对象代码的情况下,扩展其功能,广泛应用于权限控制、日志记录、延迟加载等场景。
静态代理在编译时就已经确定了代理类和真实类的关系。例如,实现一个UserService
接口,通过代理类UserServiceProxy
来控制对UserServiceImpl
的访问,并在代理类中添加日志记录功能。
public interface UserService {
void addUser(String name);
}
public class UserServiceImpl implements UserService {
@Override
public void addUser(String name) {
System.out.println("User added: " + name);
}
}
public class UserServiceProxy implements UserService {
private final UserService userService;
public UserServiceProxy(UserService userService) {
this.userService = userService;
}
@Override
public void addUser(String name) {
System.out.println("[LOG] Adding user...");
userService.addUser(name);
System.out.println("[LOG] User added.");
}
}
public class StaticProxyDemo {
public static void main(String[] args) {
UserService userService = new UserServiceProxy(new UserServiceImpl());
userService.addUser("Alice");
}
}
动态代理在运行时动态生成代理类,通过java.lang.reflect.Proxy
类和InvocationHandler
接口实现。动态代理更加灵活,适用于目标对象没有实现接口的情况。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class UserServiceDynamicProxy implements InvocationHandler {
private final Object target;
public UserServiceDynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("[LOG] Method " + method.getName() + " is called");
Object result = method.invoke(target, args);
System.out.println("[LOG] Method " + method.getName() + " execution completed");
return result;
}
public static Object createProxy(Object target) {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new UserServiceDynamicProxy(target));
}
}
public class DynamicProxyDemo {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserService proxy = (UserService) UserServiceDynamicProxy.createProxy(userService);
proxy.addUser("John Doe");
}
}
动态代理在许多实际开发场景中都有广泛应用,例如在Spring框架中通过动态代理实现AOP(面向切面编程),使得横切关注点如日志记录、事务管理等可以集中管理和复用。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。