java基础知识---反射与new的概念

概述:之前在学习spring框架时,重点了解了一些依赖注入(即:控制反转),这里最核心的概念就是反射的机制,那么我今天将冲3个方面了梳理一下new和反射的概念

1、new只有在知道类名之后才能new,而反射有时候不需要

反射实例对象的方式

-->知道类名的情况:

Class<?> c1 = Class.forName("cn.classes.OneClass");

Class<?> c2 = new OneClass.getClass();

Class<?> c3 = OneClass.class();

-->不知道类名的情况:通过动态代理实现的

首先jvm在其内部通过函数ProxyGenerator.generateProxyClass()方法来生成代理对象的字节码文件(其实就没有具

体文件,一切都是在内存中,暂时就这么叫吧),然后defineClass0()函数利用之前生成的二进制字节码文件来创建

类Class对象,并顺便为代理类命名(proxyName是在字节码文件生成之前自己命名的),经过这个过程我们就可以在不

知道类名的情况下得到了类Class对象了,然后就可以使用反射来获取对象实例了(这其中牵扯到类加载的加载过程,

具体内容请详看有关资料)

2、new出来的对象中,我们是无法反问她的私有属性,而反射可以(通过setAccessible()取访问)

3、new属于静态编译,而反射属于动态编译,静态编译就是在编译的时候把你所有的模块都编译进exe里去,当你启动这个exe的时候所有模块都加载进来了。你写小程序没问题,但程序一大,加载的过程(就是当你运行程序时初始化的过程)就比较费力了。。大多数ppc的硬件配置还是很一般的。动态编译就不一样了,你编译的时候那些模块都没有编译进去,一般情况下你可以把那些模块都编译成dll,这样你启动程序(初始化)的时候这些模块不会被加载,而是在运行的时候,用到那个模块就调用哪个模块。