java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JDK动态代理

JDK动态代理详细解析

作者:一码评川

这篇文章主要介绍了JDK动态代理详细解析,在Java的动态代理机制中,有两个重要的类和接口,一个是InvoInvocationHandler(接口)、Proxy(类),这一个类和接口是我们动态代理所必须用到的,需要的朋友可以参考下

一、说明

在Java的动态代理机制中,有两个重要的类和接口,一个是InvoInvocationHandler(接口)、Proxy(类),这一个类和接口是我们动态代理所必须用到的。

在这里插入图片描述

优点:

缺点:

二、主要类方法的说明

InvocationHandler接口

每个动态代理类都必须实现InvocationHandler接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler接口的invoke方法来进行调用。

InvocationHandler接口的invoke方法

**proxy存在的意义:**

1. 可以使用反射获取代理对象的信息(也就是proxy.getClass().getName())。

2. 可以将代理对象返回以进行连续调用,这就是proxy存在的目的,因为this并不是代理对象。

Proxy 类

Proxy类的作用就是用来动态创建一个代理类对象的类,它提供了许多的方法,但是我们用的最多的就是newProxyInstance这个方法

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

打印代理的类:

System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

三、关键步骤

创建InvocationHandler实现类

public class MapperProxy<T> implements InvocationHandler {
      private Class<T> proxyInterface;
    //这里可以维护一个缓存,存这个接口的方法抽象的对象
    MapperProxy(Class<T> proxyInterface){
        this.proxyInterface = proxyInterface;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行前...");
        Constructor constructor  = proxyInterface.getConstructor();
        Object o =  constructor.newInstance();
        method.invoke(o,args);
        System.out.println("执行后");
        return null;
    }
}

通过 Proxy.newProxyInstance() 创建代理实例

 Fly fly = (Fly) Proxy.newProxyInstance(MyFly.class.getClassLoader(),new Class[]{Fly.class, Fly.Fly2.class},new MapperProxy<>(MyFly.class));

在这里插入图片描述

-  创建代理类-   Class<?> cl = getProxyClass0(loader, intfs);

-  获取有参构造器  Constructor<?> cons = cl.getConstructor(constructorParams);这里的参数就是InvocationHandler

-  通过构造器创建代理实例-参数就是方法的第三个参数

分析生成的代理类

在这里插入图片描述

在这里插入图片描述

结论 

调用代理类的doFly()

这里会调用 super.h.invoke(this, m3, (Object[])null);

super.h就是我们再创建代理对象是传入的MapperProxy,所有这里会执行MapperProxy.invoke方法(在这里我们就可动态的对该执行方法进行增强)

在这里插入图片描述

到此这篇关于JDK动态代理详细解析的文章就介绍到这了,更多相关JDK动态代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文