1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > jdk动态代理详解(通俗易懂 5分钟带你快速理解动态代理)全网最简

jdk动态代理详解(通俗易懂 5分钟带你快速理解动态代理)全网最简

时间:2020-12-04 07:29:41

相关推荐

jdk动态代理详解(通俗易懂 5分钟带你快速理解动态代理)全网最简

相信很多小伙伴都不理解动态代理,

它是怎么代理的?怎么用?听了很多课程还是不会

我这次用最简单通俗易懂的代码来解释jdk动态代理,希望各位小伙伴能听懂,喜欢就点个赞在走吧!

活不多说,直接上代码.

第一种:最简代码(需要会lambda,反射知识才能看懂)

public static void main(String[] args) {//主方法ClacInterface myClac = new MyClac(); //被代理的对象//生成了一个代理类对象proxyBeanClacInterface proxyBean = (ClacInterface)Proxy.newProxyInstance(//第一个参数被代理类的类加载器myClac.getClass().getClassLoader(), //第二个参数myClac的所以实现接口myClac.getClass().getInterfaces(),//第三参数是InvocationHandler 这里是lambda简化的匿名内部类写法(a, b, c) -> {System.out.println("我代理了myClac对象");return b.invoke(myClac, c);} );System.out.println("proxyBean.add(1, 3) = " + proxyBean.add(1, 3));}

输出结果:

接口

public interface ClacInterface {int add(int a ,int b );}

实现类

public class MyClac implements ClacInterface{@Overridepublic int add(int a, int b) {System.out.println("a+b"+"="+(a+b));return a+b;}}

使用动态代理的目的: 增强代理对象的方法

上面的代码就实现了动态代理, 通过jdkProxy类生成了一个proxyBean(这个对象就是代理对象)

然后执行了被代理对象MyClac中的方法.

这也就是动态代理,运行时生成了一个代理对象!

哈哈,可能很多小伙伴看到这是一脸懵逼,我把上面代码都详细解释和改造成第二版

第二版(详细解释每一步具体意思)

public static void main(String[] args) {//创建接口的实现类对象,也就是被代理对象ClacInterface myClac = new MyClac();//获取被代理实现类对象的Class对象Class<? extends ClacInterface> clazz = myClac.getClass();//第一个参数,被代理对象的类加载器ClassLoader classLoader = clazz.getClassLoader();//第二个参数,被代理对象实现的所有接口数组Class<?>[] interfaces = clazz.getInterfaces();//通过调用Proxy.newProxyInstance的方法来创建一个代理类对象来代理myClac对象ClacInterface proxyBean = (ClacInterface)Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {//第三个参数InvocationHandler的实现类,这里用了匿名内部类的方式@Override//重写InvocationHandler的invoke方法,他有三个参数可以供我们使用public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//第一个参数proxy 可以通过proxy.getClass().getClassName() 来查看对象,是一个匿名的Proxy的代理类System.out.println("proxy.getClass().getName() = " + proxy.getClass().getName());System.out.println("前置增强------");//第二个参数method 也就是被代理对象myClac对象的方法,可以通过method调用myClac的方法//第三个参数args 也就是MyClac方法执行时传入的实际参数//method.invoke的返回值就是myClac方法的返回值Object invoke = method.invoke(myClac, args);System.out.println("后置增强------");return invoke;}});System.out.println("proxyBean.add(1, 3) = " + proxyBean.add(1, 3));}

输出结果

到这里,我觉得很多小伙伴可能已经理解了动态代理代码怎么实现,也有可能是一脸懵,所以我在文末总结了下jdk动态代理:

java反射包中的Proxy类可以调用newProxyInstance创建一个代理类对象.

传入三个参数,

一个是代理类的类加载器,

一个是实现的所有接口数组,

一个调用处理器的实现类.

创建好了代理对象,代理对象就可以执行被代理类实现的接口的方法,在执行方法时,会先去执行调用处理器实现类中的invoke方法,invoke方法就可以对被代理类进行功能增强.

希望本文能对你有帮助.喜欢的话留下点赞关注在走吧~~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。