浅析AOP实现原理(2)JDK动态代理
2017-12-19 14:13
393 查看
在上一篇文章中我们聊了聊静态代理的实现,除了静态代理,AOP中主要用到的是动态代理即JDK动态代理和CGLIB动态代理
Proxy类最重要的方法就是newProxyInstance,参数如下:
@loader 类加载器,用于生成代理类的实例
@interfaces 基础接口
@h 你所实现的InvocationHandler
在输入方法所需要的参数后,它会生成一个代理对象,并在调用者调用委托对象的方法时,invocationHandler的invoke方法会被触发(具体见下面)
这个接口中只提供了一个invoke方法,方法参数如下:
@proxy 代理调用该方法的代理实例
@method 要调用的方法
@args 方法中的参数
invoke方法中,我们可以调用method的invoke(委托对象,方法参数)方法来间接调用委托对象中的方法,也能在该方法前后做一些额外的处理,该方法是AOP所实现的共同逻辑所在
1、首先定义一个委托接口
2、生成委托类
3、生成InvocationHandler实现类
4、测试
5、输出结果
jdk动态代理
jdk动态代理是运行时JAVA反射机制生成相应对象的代理类而程序员手动编码生成,其中主要用到接口InvocationHandler和一个类ProxyProxy类
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { ..... }
Proxy类最重要的方法就是newProxyInstance,参数如下:
@loader 类加载器,用于生成代理类的实例
@interfaces 基础接口
@h 你所实现的InvocationHandler
在输入方法所需要的参数后,它会生成一个代理对象,并在调用者调用委托对象的方法时,invocationHandler的invoke方法会被触发(具体见下面)
InvocationHandler接口
public interface InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; }
这个接口中只提供了一个invoke方法,方法参数如下:
@proxy 代理调用该方法的代理实例
@method 要调用的方法
@args 方法中的参数
invoke方法中,我们可以调用method的invoke(委托对象,方法参数)方法来间接调用委托对象中的方法,也能在该方法前后做一些额外的处理,该方法是AOP所实现的共同逻辑所在
实现过程
还是用上一篇文章的杀手例子1、首先定义一个委托接口
public interface Killer { void kill(); }
2、生成委托类
public class KillerImpl implements Killer{ @Override public void kill() { // TODO Auto-generated method stub System.out.println("正在杀人,请勿打扰"); } }
3、生成InvocationHandler实现类
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyClient implements InvocationHandler{ private Object object; public ProxyClient(Object object) { this.object = object; } public static Object getProxy(Object object){ return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new ProxyClient(object)); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我准备杀人啦"); Object result = method.invoke(object, args); System.out.println("杀完啦"); return result; } }
4、测试
public class TestKiller { public static void main(String[] args) { Killer killer = (Killer) ProxyClient.getProxy(new KillerImpl()); killer.kill(); } }
5、输出结果
![](http://upload-images.jianshu.io/upload_images/5000473-dc2483e59bdf2842.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
相关文章推荐
- 浅析AOP实现原理(1)静态代理
- 深入浅析Spring 的aop实现原理
- 深入浅析Spring 的aop实现原理
- 深入浅析Spring 的aop实现原理
- 浅析 Linux 中的时间编程和实现原理,第 1 部分: Linux 应用层的时间编程
- Spring IOC和Spring AOP的实现原理(源码主线流程)
- hashmap实现原理浅析
- 浅析 Linux 中的时间编程和实现原理,第 1 部分: Linux 应用层的时间编程
- Spring技术内幕:Spring AOP的实现原理(三)
- 加强2注解。泛型。类加载器及其委托机制。代理的概念与作用原理,AOP概念。实现AOP功能的封装与配置。类似Spring。
- 【转】浅析SkipList跳跃表原理及代码实现
- Spring的AOP实现原理
- java NIO Netty实现原理浅析(转)
- Netty实现原理浅析
- 数据结构 — 浅析红黑树原理以及实现
- Netty实现原理浅析
- 反射实现 AOP 动态代理模式(Spring AOP 的实现原理)
- AOP原理与实现--反射&代理模式&动态代理
- 通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理)
- 实现AOP动态代理原理