java动态代理实现demo
Posted 徐敬哲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java动态代理实现demo相关的知识,希望对你有一定的参考价值。
1.创建接口:
/** * @author JingZhe @time 2021/10/20 9:45 */ public interface Person { /** 测试方法 */ void doSomething(); }
2.创建接口的实现类:
/** * @author JingZhe @time 2021/10/20 9:48 */ public class JingZhe implements Person { @Override public void doSomething() { System.out.println("jingZhe doing Something"); } }
3.创建动态代理类:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author JingZhe @time 2021/10/20 9:44 */ public class JDKDynamicProxy implements InvocationHandler { /** 声明被代理的对象 */ private Person person; /** 构造函数 */ public JDKDynamicProxy(Person person) { this.person = person; } /** 获取代理对象 */ public Object getProxy() { Object proxyInstance = Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), this); return proxyInstance; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("对原方法进行了前置增强"); // 原方法执行 Object invoke = method.invoke(person, args); System.out.println("对原方法进行了后置增强"); return invoke; } }
4.编写测试类:
/** * @author JingZhe @time 2021/10/20 9:46 */ public class proxyTest { public static void main(String[] args) { System.out.println("不使用代理类,调用doSomething"); Person person = new JingZhe(); person.doSomething(); System.out.println("--------------------------"); System.out.println("使用代理类,调用doSomething"); Person proxy = (Person) new JDKDynamicProxy(new JingZhe()).getProxy(); proxy.doSomething(); } }
测试结果:
不使用代理类,调用doSomething jingZhe doing Something -------------------------- 使用代理类,调用doSomething 对原方法进行了前置增强 jingZhe doing Something 对原方法进行了后置增强
以上。
java 动态代理 demo 实现原理 参数理解
动态代理两个重要的组成: Proxy 与 InvocationHandler
Hello1 hello = (Hello1) Proxy.newProxyInstance(Hello.class.getClassLoader(),new Class[]Hello1.class,new HelloProxy<HelloWorld>(new HelloWorld()));
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)
第一个类加载器, 目前觉得这个理解的不到位,因为要生成一个在内存中的代理对象,需要一个类加载器器,平常
第二个参数,被代理对象的所有接口,假如 hello 实现了 Hello 、 Hello1 这两个接口,这个参数 就变数,两个接口组成的 class数组, 参数的目的是: 本质上其实是多态, 这样
Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), this); 这个方法可以 强制转换成Hello 也可以是 Hello1
第三个参数 这个参数 要实现 InvocationHandler 接口
InvocationHandler 要实现的方法如下:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
三个参数: proxy 这个感觉没有用上
这样的是第二个参数: method 这个是被代理类的接口层的实现方法的Class 对象,比如有个方法 sayHello 这个就是sayHello 的class 对象,然后通过反射机制 去调用这个方法
第三个参数 就是方法使用到的参数
以上是关于java动态代理实现demo的主要内容,如果未能解决你的问题,请参考以下文章