java的jdk动态代理

Posted 夏的世界存在的伤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的jdk动态代理相关的知识,希望对你有一定的参考价值。

JDK动态代理实现原理

动态代理机制

  • 通过实现 InvocationHandler 接口创建自己的调用处理器

  • 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类

  • 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型

  • 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入

Interface InvocationHandler

该接口中仅定义了一个方法Object:invoke(Object obj,Method method,Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。

Proxy

  • 该类即为动态代理类

  • Protected Proxy(InvocationHandler h)

    • 构造函数,用于给内部的h赋值
  • Static Class getProxyClass (ClassLoader loader,Class[] interfaces)

    • 获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组
  • Static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)

    • 返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)
  • Dynamic Proxy

    • 它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

代码示例

创建接口:

/**
 * @CreateDate: 2019/6/17 14:52
 * @Version: 1.0
 */
public interface BuyService {

    String buyPhone();

    String buyComputer();

}

  创建实现类:

public class BuyServiceImpl implements BuyService {

    @Intercept("buyPhone")
    @Override
    public String buyPhone() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("==========BuyServiceImpl.class=============" + " buyPhone");
        this.buyComputer();
        return "buy phone";
    }

    @Intercept("buyComputer")
    @Override
    public String buyComputer() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("==========BuyServiceImpl.class=============" + " buyComputer");
        return "buy computer";
    }
}

创建 InvocationHandler:

public class ReflectionHandler implements InvocationHandler {

    private Object target;

    public ReflectionHandler(Object target) {
        this.target = target;
    }

    public <T> T getProxy(){
        return (T) Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(target,args);
    }
}

创建启动类:

public class Bootstrap {

    public static void main(String[] args) {

        // 动态代理实现
        ReflectionHandler reflectionHandler = new ReflectionHandler(new BuyServiceImpl());

        BuyService proxy = reflectionHandler.getProxy();

        String computer = proxy.buyComputer();

        String phone = proxy.buyPhone();

        System.out.println(computer + "
" + phone);
    }

 

以上是关于java的jdk动态代理的主要内容,如果未能解决你的问题,请参考以下文章

Java中的JDK动态代理

java动态代理:JDK动态代理的内部原理

动态代理

Java代理(jdk静态代理动态代理和cglib动态代理)

百度T7:深入理解Java动态代理与代码模拟JDK实现动态代理JAVA核心

高仿JDK动态代理 底层源码实现