老师说错了,这里是Proxy的正确解释

来源:2-3 了解 JDK 动态代理

冰哲

2015-08-31 14:54

关于Proxy的正确解释

http://img.mukewang.com/55e3f9ec00016f3b06810563.jpg

写回答 关注

5回答

  • 慕粉3237070
    2020-07-10 10:52:22

    在这个例子中proxy没有被使用到,只是占了个参数位。

  • qq_曉月姑蘇_0
    2017-01-14 16:59:35

    解释:

    1.     Proxy即动态代理类;

    2.     Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用;

    它有三个参数:

    ClassLoader loader    ----指定被代理对象的类加载器

    Class[] Interfaces    ----指定被代理对象所以事项的接口

    InvocationHandler h  ----指定需要调用的InvocationHandler对象

    3.     实现InVocationHandler接口的LogHandler_old对象

    这个对象的invoke()方法就是Proxy这个动态代理类所代理的接口类的抽象方法的真实实现;

    它有三个参数:

    Object proxy          -----代理类对象

    Method method         -----被代理对象的方法(这里不是接口的抽象方法了,是具体的实现类中的方法)

    Object[] args         -----该方法的参数数组


    JDK中具体的动态代理类是怎么产生的呢?

    1.产生代理类$Proxy0类

    执行了Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

    将产生$Proxy0类,它继承Proxy对象,并根据第二个参数,实现了被代理类的所有接口,自然就可以生成接口要实现的所有方法了(这时候会重写hashcode,toString和equals三个方法),但是还没有具体的实现体;

    2.    将代理类$Proxy0类加载到JVM中

    这时候是根据Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)它的第一个参数----就是被代理类的类加载器,把当前的代理类加载到JVM中

    3.    创建代理类$Proxy0类的对象

    调用的$Proxy0类的$Proxy0(InvocationHandler)构造函数,生成$Proxy0类的对象

    参数就是Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)它的第三个参数

    这个参数就是我们自己实现的InvocationHandler对象,我们知道InvocationHandler对象中组合加入了代理类代理的接口类的实现类;所以,$Proxy0对象调用所有要实现的接口的方法,都会调用InvocationHandler对象的invoke()方法实现;

    4.    生成代理类的class byte

    动态代理生成的都是二进制class字节码

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    动态代理是很多框架和技术的基础, spring

    的AOP实现就是基于动态代理实现的。了解动态代理的机制对于理解AOP的底层实现是很有帮助的。

    Proxy类的设计用到代理模式的设计思想,Proxy类对象实现了代理目标的所有接口,并代替目标对象进行实际的操作。但这种替代不是一种简单的替代,这样没有任何意义,代理的目的是在目标对象方法的基础上作增强,这种增强的本质通常就是对目标对象的方法进行拦截。所以,Proxy应该包括一个方法拦截器,来指示当拦截到方法调用时作何种处理。InvocationHandler就是拦截器的接口。

    InvocationHandler接口也是在java.lang.reflec

    Object invoke(Object proxy, Method method, Object[] args)

    这个接口有三个参数,其中第二和第三个参数都比较好理解,一个是被拦截的方法,一个是该方法的参数列表。关键是第一个参数。按照doc文档的解析,

    proxy - the proxy instance that the method was invoked on

    也就是说,proxy应该是一个代理实例,但为什么要传入这个参数呢?

    带着这个问题,自己编了个小程序作了一点试验。

    ///////////////////////////////////////

    public interface IAnimal {

    void info();


  • 还在拼
    2016-06-23 21:03:06

    http://img.mukewang.com/576bdd4c0001257109550576.jpg

    上面红色框起来的代码,结果显示为true。是不是表示proxy指的是被代理对象。该怎么解释?

    qq_为了美...

    jiushi

    2017-09-08 20:19:19

    共 2 条回复 >

  • gao634209276
    2016-03-30 23:58:49

    是的,target是被代理的类对象,所以Test方法中传递的是Car对象

    proxy,method,args都是代理类对象的实例,实例方法,实例方法的参数

    而实现invoke方法中的method.invoke(car);正好也就是car.move()的反射

  • qq_王翊_0
    2015-10-29 21:57:24

    这个地方讲的确实有问题。有点迷糊。关于proxy具体是干什么的有待探讨

模式的秘密---代理模式

本节课程将带你领略Java编程语言中代理模式的奥妙

54914 学习 · 98 问题

查看课程

相似问题