• 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);
        }
    没有停止的脚步,只有倒下去的脚步
  • 相关阅读:
    网站上线的过程
    PHP的四种基本算法
    YII框架第三方微博登录
    《正三角》《倒三角》
    PHP实现四种基本排序
    php实现快速排序
    iwebshop 简介
    收集的伪静态中经常使用的一些参数
    我与AI的相识
    phpstudy下的nginx服务器显示目录
  • 原文地址:https://www.cnblogs.com/hkMblogs/p/13171733.html
Copyright © 2020-2023  润新知