JDK中的动态代理

什么是动态代理?
实现某个接口方法的类A,要在不改变这个类代码的前提下,在类执行 方法的前后加入一些代码(日志、切面、事务),这时候就需要一个代理对象Proxy( 也实现这个接口方法),在方法中执行这个类A的方法,顺便在方法前后加代码 (日志、切面、事务)

核心类:Proxy
核心代码:
   
   
  1. //要被代理的类
  2. Tank tank = new Tank();//实例化类XXX接口
  3. //得到代理的实例对象
  4. //1.类加载器 2.代理对象实例化的接口 3.handler负责写代理的业务逻辑
  5. XXX xxx = (XXX)Proxy.newProxyInstance(ClassLoader classLoader,
  6. Class<?>[] interfaces,
  7. InvocationHandler invocationHandler);
  8. //执行代理实例的方法,实现日志、事务等功能
  9. xxx.move();
interfaces通过反射得到接口的每个方法
invocationHandler中的invoke(Method m)方法可以动态对某一个方法进行处理
XXXInvocationHandler.java
   
   
  1. public class XXXInvocationHandler implements InvocationHandler{
  2. Object target;//被代理的对象
  3. public XXXInvocationHandler(Object o){
  4. super();
  5. this.target = o;
  6. }
  7. @Overrride
  8. invoke(Object target,Method method){
  9. //前面写方法执行前的代理逻辑
  10. method.invoke(target);//调用被代理类的方法
  11. //后面写方法执行后的代理逻辑
  12. }
  13. }

Proxy类中执行了什么操作?
通过执行newProxyInstance();方法
1.选择对应的类加载器将class二进制文件( 拼接字符串得到)载入JVM内存
2.得到用户代理对象实现的接口-----反射---- 得到接口的方法
3.执行InvocationHandler的 invoke方法(包含被代理类的方法+添加的日志)-----实现动态代理

实现方法:JDK Compiler API或CGLIB ASM直接生成class二进制文件

作用:日志、事务、权限控制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值