zoukankan      html  css  js  c++  java
  • java 动态代理 Proxy.newProxyInstance 使用心法

    使用JDk的Proxy类的静态方法newProxyInstance ,让JVM自动生成一个新的类,类中包含了inerfaces参数中的所有方法,每个方法都调用h.invoke 方法
     
     
     
    AOP 动态代理
     
    package com.atguigu.spring.aop;
     
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.Arrays;
     
    //代理类
    public class ArithmeticCalculatorLoggingProxy {
     
    //1.被代理的对象 目标对象
    private ArithmeticCalculator target ; // 实际上是ArithmeticCalculatorImpl对象.
     
    //通过构造器的方式将目标对象传入
    public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target){
    this.target = target ;
    }
     
    //获取代理对象
    public ArithmeticCalculator getLoggingProxy(){
    //定义代理对象
    ArithmeticCalculator proxy ;
     
    /**
    * loader: ClassLoader 类加载器
    * interfaces: 目标类的所有接口,目的是获取接口中的方法
    * h: InvocationHandler
    */
    ClassLoader loader = target.getClass().getClassLoader();
    Class[] interfaces = target.getClass().getInterfaces();
    InvocationHandler h = new InvocationHandler() {
    /**
    * proxy:代理对象 在invoke方法中一般不会用
    * method:正在调用的方法
    * args:调用方法传入的参数
    */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    String methodName = method.getName();
    //加日志
    System.out.println("ATGUIGU===>The method "+methodName+" begins with "+ Arrays.asList(args));
    //执行目标方法
    Object result = method.invoke(target, args);
    //加日志
    System.out.println("ATGUIGU===>The method "+methodName+" ends with " + result );
    return result;
    }
    };
     
    proxy = (ArithmeticCalculator)Proxy.newProxyInstance(loader, interfaces, h);
     
     
    使用JDk的Proxy的静态方法newProxyInstance ,让JVM自动生成一个新的类,类中包含了inerfaces参数中的所有方法,每个方法都调用h.invoke 方法
    return proxy ;
    }
     
     
    }
     
  • 相关阅读:
    博客链接--竹子
    升级sudo至1.9.5p2,修复sudo漏洞
    使用Jenkins自动打包部署前端
    升级sudo至1.9.5p2,修复sudo漏洞
    60行C代码实现一个shell
    copy_{to, from}_user()的思考
    Code Server 是什么?
    Linux常用命令学习(5)
    Linux sudo权限提升漏洞(CVE-2021-3156)
    厚书读薄丨《Vim实用技巧》第一部分 模式
  • 原文地址:https://www.cnblogs.com/jiangtao1218/p/11862907.html
Copyright © 2011-2022 走看看