动态代理的疑问:在程序的编译阶段,new操作都做了什么

来源:互联网 发布:各大电商平台双11数据 编辑:程序博客网 时间:2024/05/22 17:21


OK ,我们来回顾一下,之前的博文《Java代理模式详解及案例分析:静态代理/动态代理 》提出的几个问题:

1,什么是代理模式?
2,Java中,静态代理与动态代理的区别?
3,Spring使用的是JDK的动态代理,还是CGLIB的动态代理?
4,JDK的动态代理的实现原理?
5,JDK的动态代理与CGLIB的动态代理的实现上,有何不同?
6,你知道的,还有其他动态代理技术吗?请简述实现原理。

之前的那篇博文,并没有回答清楚上面提出的所有问题。比如:
3,Spring使用的是JDK的动态代理,还是CGLIB的动态代理?
6,你知道的,还有其他动态代理技术吗?请简述实现原理。

Spring的动态代理,集成了JDK的动态代理和CGLIB的动态代理。可以在2者之间切换。这是网上的说法,具体情况
有待研究。

并且,我今天又整理了一下思绪,发现这个问题,可以往更深入的方向去探讨。在探讨之前,我以个人的理解,
说一下,我理解的静态代理与动态代理。静态代理与动态代理区别的关键在于“静态”和“动态”上。在java中,我们
经常会提到这个概念。其实在java领域,静态就是通过new关键字来生成对象,动态就是使用java的反射机制来
生成对象。或者说从本质上来说,new对象与反射生成对象到底有何区别呢?研究过JVM的同学应该知道,new对象是
在程序的编译阶段建立对象之间的依赖,而反射生成对象,是在程序的运行阶段建立对象之前的依赖。也就是说,
new对象与反射生成对象的本质区别是建立对象依赖的时机不同。

那么,我要问了:
1,为什么new对象,在程序编译阶段就建立了对象之间的依赖?
2,在程序的编译阶段,new操作都做了什么?
3,jdk的动态代理,Proxy.newInstance(),一共需要我们传递三个参数:
    * target.getClass().getClassLoader() 目标对象的类加载器
    * target.getClass().getInterface()   目标对象的类实现的接口
    * this                               当前类对象(也就是自己实现的那个动态代理类的对象)
    问题来了:目标对象的类加载器是哪个类加载器:Bootstrap Classloader,Extended Classloader,
Application Classloader。还有,动态代理加载类,最终调用了Class.forName()方法,这个方法可以加载
字节码文件,也就是编译以后的java文件。那么,Class.forName()方法,可以加载java源文件吗?如果不能,
那么,new关键字呢,new关键字能加载java源文件吗?

要回答这些问题,需要JVM方面的知识,本人虽然也学习过JVM的知识,但是要让我很清楚的回答上述问题,
还是很勉强的,所以需要修炼一段,带着这些问题,再去学习JVM的知识。这篇博文mark一下,最近项目也
很忙,怕忘了,所以先整理出来,mark一下,有时间继续研究。

0 0