java使用反射生成JDK动态代理
一、基本简介
在java的java.lang.reflect包下提供了一个Proxy类和InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类或动态代理对象。
Proxy类提供了两个方法:
static Class< ? > getProxyClass( ClassLoader loader,Class< ? > … interfaces) :
创建一个动态代理类所对应的Class对象,该代理类将实现interfaces所指定的多个接口。
第一个参数指定生成动态代理类的类加载器。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动态代理相关推荐
- 使用反射生成 JDK 动态代理
反射 反射赋予了我们在运行时分析类和执行类中方法的能力. 通过反射,可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性. 使用反射生成 JDK 动态代理 JDK 动态代理只能为接口创建动态代 ...
- java基础5:工厂模式、单例模式、File文件类、递归、IO流、Properties配置文件、网络编程、利用IO流模拟注册登录功能、关于反射、JDK动态代理
1.工厂模式 23种java设计模式之一 1)提供抽象类(基类) 2)提供一些子类,完成方法重写 3)提供一个接口:完成具体子类的实例化对象的创建,不能直接new子类,构造函数私有化. 优点:具体的子 ...
- java静态代理和JDK动态代理
静态代理 编译阶段就生产了对应的代理类 public interface IBussiness {void execute(); } public class BussinessImpl implem ...
- Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理
文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...
- jdk动态代理与cglib动态代理例子
1.JAVA的动态代理特征:特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象 ...
- Cglib和jdk动态代理
前言:动态代理解决了方法之间的紧耦合,IOC解决了类与类之间的紧耦合. Cglib和jdk动态代理的区别? 1.Jdk动态代理:利用拦截器(必须实现InvocationHandler)加上反射机制生成 ...
- JDK动态代理的底层实现原理
JavaEE的开发中,许多框架用到了动态代理机制,例如Spring的AOP编程. 这里不介绍动态代理和静态代理概念,有兴趣的朋友自行百度. Java中的动态代理一般就两种:1. JDK自带 : 2. ...
- Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)
1. Annotation注解 1.1. Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...
- JDK动态代理实现与原理分析
1.何为代理 代理在我们的日常生活中,就有很多体现,房屋租赁代理,校园辅导班招生代理,化妆产品销售代理等.为什么我们要找代理呢,代理是专业的,是方便的.例如我们买一件化妆品,或买一本书,肯定是不能去找 ...
- Cglib和jdk动态代理的区别
Cglib和jdk动态代理的区别 动态代理解决了方法之间的紧耦合, IOC解决了类与类之间的紧耦合! Cglib和jdk动态代理的区别? 1.Jdk动态代理:利用拦截器(必须实现InvocationH ...
最新文章
- 基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词
- 扩展屏幕没有连接,但程序窗口还在扩展屏幕上,在看不到这个屏幕的情况下,把程序窗口拉回来的方法
- 随笔汇总_索取资料请进入
- OpenCV 笔记 -- 边缘检测(Sobel、Laplace、Canny)
- 20172311 2017-2018-2 《程序设计与数据结构》第八周学习总结
- JDK 14中的常规,安全和确定性外部内存访问
- (王道408考研操作系统)第五章输入/输出(I/O)管理-第一节2:I/O控制器
- Go泛型草案设计简明指南
- 英特尔成立集成光电研究中心 加速光互连I/O创新
- 数据产品经理——数据指标
- [分享]我们团队管理的最佳实践——企业积分制度应该如何建立?
- 东南亚电商龙头 shopee 社招,校招 内推(长期有效)
- [转载]autorun.inf病毒源代码
- 死链检查工具 Xenu
- springboot+英语在线学习系统 毕业设计-附源码211714
- 使用python有趣地解决一道动态币值规划方案
- codec和DSP的区别
- BUUCTF 世上无难事
- MySQL的四种事务隔离级别
- [NAS] Synology(群晖) / QNAP(威联通) 设置 MariaDB 远程访问 (附带多设备DB速度测试)
热门文章
- 总决赛G5:冠军团队的样子,令人动容
- 微信小程序实践——实验4高校新闻网
- gzip already installed and latest version解决方法
- 批量替换 Word 文档某几页
- 5分钟了解英文SEO做外链的正确姿势
- 高斯-勒让德求积公式及Matlab实现
- 免费和开源引擎的游戏引擎,转载自维基
- 批量Batch and 动量Momentum
- “霜降”,“农历”,“二十四节气”,英语怎么说?
- zookeeper启动报错already running as process处理