一、基本简介
在java的java.lang.reflect包下提供了一个Proxy类和InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类或动态代理对象。

Proxy类提供了两个方法:

  1. static Class< ? > getProxyClass( ClassLoader loader,Class< ? > … interfaces) :
    创建一个动态代理类所对应的Class对象,该代理类将实现interfaces所指定的多个接口。
    第一个参数指定生成动态代理类的类加载器。

  2. static Object newProxyInstance( ClassLoader loader,Class< ? >[] interfaces,InvocationHandler h):
    直接创建一个动态代理对象,该代理对象的实现类实现了Interfaces指定的系列接口,执行代理对象的每个方法都会被替换成InvocationHandler对象的invoke方法。

实际上,即使采用第一种方法生成动态代理类之后,如果程序需要通过该代理类来创建代理对象,还是需要传入一个InvocationHandler实例。

代码示例:

 try {//创建一个InvocationHandler对象InvocationHandler invocationHandler = new MyInvocationHandler();//使用Proxy生成一个动态代理类proxyClassClass proxyClass= Proxy.getProxyClass(Foo.class.getClassLoader(),Foo.class);//获取一个proxyClass类带InvocationHandler参数的构造器Constructor constructor = proxyClass.getConstructor(InvocationHandler.class);//调用constructor的newInstance方法生成动态代理实例Foo foo = (Foo) constructor.newInstance(invocationHandler);} catch (Exception e) {e.printStackTrace();}

以上的代码可以简化为下面的代码

InvocationHandler invocationHandler = new MyInvocationHandler();Foo foo= (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[]{Foo.class},invocationHandler);

二、实践操作

public interface Person {void sleep();
}public class Man implements Person {@Override public void sleep() {System.out.println("开始睡觉了");}
}public class LogUtil {public void filter1(){System.out.println("在代理对象的方法执行之前,进行拦截做点什么");}public void filter2(){System.out.println("在代理对象的方法执行之后,进行拦截做点什么");}
}

生成代理对象

public class MyProxyFactory {public static  Object getProxy(Object target){MyInvocationHandler handler = new MyInvocationHandler();handler.setTarget(target);return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),handler);}
}
public class MyInvocationHandler implements InvocationHandler {//需要被代理的对象private Object target;public void setTarget(Object target){this.target=target;}//1.proxy代表动态代理的对象//2.method代表正在执行的方法//3.args代表调用目标方法时传入的实参@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {LogUtil log = new LogUtil();log.filter1();//通过反射执行动态代理对象的所有方法Object obj=method.invoke(target,args);log.filter2();return obj;}
}
 public static void main(String[] args){Person target = new Man();Person man= (Person) MyProxyFactory.getProxy(target);man.sleep();}

运行结果:

三、总结
一般普通编程无需用到动态代理,但在编写框架或底层代码时,它的作用就非常大了。还有就是使用动态代理可以非常灵活的实现解耦。

参考《疯狂java讲义》

java使用反射生成JDK动态代理相关推荐

  1. 使用反射生成 JDK 动态代理

    反射 反射赋予了我们在运行时分析类和执行类中方法的能力. 通过反射,可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性. 使用反射生成 JDK 动态代理 JDK 动态代理只能为接口创建动态代 ...

  2. java基础5:工厂模式、单例模式、File文件类、递归、IO流、Properties配置文件、网络编程、利用IO流模拟注册登录功能、关于反射、JDK动态代理

    1.工厂模式 23种java设计模式之一 1)提供抽象类(基类) 2)提供一些子类,完成方法重写 3)提供一个接口:完成具体子类的实例化对象的创建,不能直接new子类,构造函数私有化. 优点:具体的子 ...

  3. java静态代理和JDK动态代理

    静态代理 编译阶段就生产了对应的代理类 public interface IBussiness {void execute(); } public class BussinessImpl implem ...

  4. Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理

    文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...

  5. jdk动态代理与cglib动态代理例子

    1.JAVA的动态代理特征:特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象 ...

  6. Cglib和jdk动态代理

    前言:动态代理解决了方法之间的紧耦合,IOC解决了类与类之间的紧耦合. Cglib和jdk动态代理的区别? 1.Jdk动态代理:利用拦截器(必须实现InvocationHandler)加上反射机制生成 ...

  7. JDK动态代理的底层实现原理

    JavaEE的开发中,许多框架用到了动态代理机制,例如Spring的AOP编程. 这里不介绍动态代理和静态代理概念,有兴趣的朋友自行百度. Java中的动态代理一般就两种:1. JDK自带 : 2. ...

  8. Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)

    1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...

  9. JDK动态代理实现与原理分析

    1.何为代理 代理在我们的日常生活中,就有很多体现,房屋租赁代理,校园辅导班招生代理,化妆产品销售代理等.为什么我们要找代理呢,代理是专业的,是方便的.例如我们买一件化妆品,或买一本书,肯定是不能去找 ...

  10. Cglib和jdk动态代理的区别

    Cglib和jdk动态代理的区别 动态代理解决了方法之间的紧耦合, IOC解决了类与类之间的紧耦合! Cglib和jdk动态代理的区别? 1.Jdk动态代理:利用拦截器(必须实现InvocationH ...

最新文章

  1. 基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词
  2. 扩展屏幕没有连接,但程序窗口还在扩展屏幕上,在看不到这个屏幕的情况下,把程序窗口拉回来的方法
  3. 随笔汇总_索取资料请进入
  4. OpenCV 笔记 -- 边缘检测(Sobel、Laplace、Canny)
  5. 20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结
  6. JDK 14中的常规,安全和确定性外部内存访问
  7. (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节2:I/O控制器
  8. Go泛型草案设计简明指南
  9. 英特尔成立集成光电研究中心 加速光互连I/O创新
  10. 数据产品经理——数据指标
  11. [分享]我们团队管理的最佳实践——企业积分制度应该如何建立?
  12. 东南亚电商龙头 shopee 社招,校招 内推(长期有效)
  13. [转载]autorun.inf病毒源代码
  14. 死链检查工具 Xenu
  15. springboot+英语在线学习系统 毕业设计-附源码211714
  16. 使用python有趣地解决一道动态币值规划方案
  17. codec和DSP的区别
  18. BUUCTF 世上无难事
  19. MySQL的四种事务隔离级别
  20. [NAS] Synology(群晖) / QNAP(威联通) 设置 MariaDB 远程访问 (附带多设备DB速度测试)

热门文章

  1. 总决赛G5:冠军团队的样子,令人动容
  2. 微信小程序实践——实验4高校新闻网
  3. gzip already installed and latest version解决方法
  4. 批量替换 Word 文档某几页
  5. 5分钟了解英文SEO做外链的正确姿势
  6. 高斯-勒让德求积公式及Matlab实现
  7. 免费和开源引擎的游戏引擎,转载自维基
  8. 批量Batch and 动量Momentum
  9. “霜降”,“农历”,“二十四节气”,英语怎么说?
  10. zookeeper启动报错already running as process处理