Java 动态代理是在运行时生成代理对象的技术。它可以对目标对象进行增强,在保留原有方法的同时,提供额外的功能。Java 动态代理主要涉及三个角色:
1. 接口:代理对象和目标对象要实现的共同接口。
2. 目标对象:被代理的实际对象。
3. 代理对象:代理目标对象,增强原有方法并提供额外方法。
代理对象包括:代理类:实现与目标对象相同的接口,用于关联目标对象并增强方法。
InvocationHandler:创建代理对象并定义要增强的方法。
Proxy:创建代理对象。实现动态代理的主要步骤:
1. 定义公共接口
interface UserService { void addUser(String name); void deleteUser(String name); }
2. 实现接口并定义目标对象
class UserServiceImpl implements UserService { public void addUser(String name) { System.out.println("Add user " + name); } public void deleteUser(String name) { System.out.println("Delete user " + name); } }
3. 实现 InvocationHandler 并定义增强方法
class ProxyHandler implements InvocationHandler { private Object target; // 目标对象 public ProxyHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before method " + method.getName()); method.invoke(target, args); // 执行目标方法 System.out.println("After method " + method.getName()); return null; } }
4. 使用 Proxy 创建代理对象
UserService userService = (UserService) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new ProxyHandler(target));
5. 使用代理对象调用方法
UserService userService = ...; // 获取代理对象 userService.addUser("John"); // 调用代理方法
输出结果:
Before method addUser
Add user John
After method addUser
可以看到,代理对象增强了目标方法,在方法前后添加了额外逻辑。这就是 Java 动态代理的作用。
© 版权声明
本文刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等部门来源于互联网,版权均归原作者所有!本网站提供的内容服务于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
联系信息:邮箱aoxolcom@163.com或见网站底部。
联系信息:邮箱aoxolcom@163.com或见网站底部。
THE END
请登录后发表评论
注册
社交帐号登录