JDK实现动态代理(真实应用案例)

参考答案

JDK实现动态代理(真实应用案例)

实例:

  1. package com.lijie;
  2.  
  3. //接口
  4. public interface UserDao {
  5. void save();
  6. }
  1. package com.lijie;
  2.  
  3. //接口实现类
  4. public class UserDaoImpl implements UserDao {
  5. public void save() {
  6. System.out.println("保存数据方法");
  7. }
  8. }

 

下面是代理类,可重复使用,不像静态代理那样要自己重复编写代理。

  1. package com.lijie;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5.  
  6. // 每次生成动态代理类对象时,实现了InvocationHandler接口的调用处理器对象
  7. public class InvocationHandlerImpl implements InvocationHandler {
  8.  
  9. // 这其实业务实现类对象,用来调用具体的业务方法
  10. private Object target;
  11.  
  12. // 通过构造函数传入目标对象
  13. public InvocationHandlerImpl(Object target) {
  14. this.target = target;
  15. }
  16.  
  17. //动态代理实际运行的代理方法
  18. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  19. System.out.println("调用开始处理");
  20. //下面invoke()方法是以反射的方式来创建对象,第一个参数是要创建的对象,第二个是构成方法的参数,由第二个参数来决定创建对象使用哪个构造方法
  21. Object result = method.invoke(target, args);
  22. System.out.println("调用结束处理");
  23. return result;
  24. }
  25. }

 

利用动态代理使用代理方法。

  1. package com.lijie;
  2.  
  3. import java.lang.reflect.Proxy;
  4.  
  5. public class Test {
  6. public static void main(String[] args) {
  7. // 被代理对象
  8. UserDao userDaoImpl = new UserDaoImpl();
  9. InvocationHandlerImpl invocationHandlerImpl = new InvocationHandlerImpl(userDaoImpl);
  10.  
  11. //类加载器
  12. ClassLoader loader = userDaoImpl.getClass().getClassLoader();
  13. Class<?>[] interfaces = userDaoImpl.getClass().getInterfaces();
  14.  
  15. // 主要装载器、一组接口及调用处理动态代理实例
  16. UserDao newProxyInstance = (UserDao) Proxy.newProxyInstance(loader, interfaces, invocationHandlerImpl);
  17. newProxyInstance.save();
  18. }
  19. }
  • 缺点:必须是面向接口,目标业务类必须实现接口。
  • 优点:不用关心代理类,只需要在运行阶段才指定代理哪一个对象。

 

以上,是Java面试题【 JDK实现动态代理(真实应用案例)】的参考答案。

输出,是最好的学习方法

欢迎在评论区留下你的问题、笔记或知识点补充~

—end—

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧