Java基础:
Java允许通过程序法的方式间接对Class的对象实例操作。Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象。通过该对象,可获得Class的结构信息,包括构造函数、属性、方法等。Java允许用户通过该元信息对象间接调用Class对象功能。
ClassLoader(类装载器):
就是寻找类的字节码文件并构造出类在JVM内部表示的对象组建。
步骤:
(1)装载:查找和导入Class文件
(2)链接:执行校验、准备和解析步骤(其中解析步骤是可选的)。
a.校验:检查载入的Class文件数据的正确性
b.准备:给类的静态变量分配存储空间
c.解析:将符号引用转成直接引用
(3)初始化:对类的静态变量、静态代码块执行初始化工作
JVM运行时会产生3个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)、AppClassLoader(系统类装载器)。
(1)根装载器:不是ClassLoader的子类,它使用C++编写,因此我们在Java中看不到它。负责装载JRE的核心类库。
(2)ExtClassLoader:负责装载JRE扩展目录ext中的JAR类包。其父装载器为 根装载器。
(3)AppClassLoader:负责装载Classpath路径下的类包。其父装载器为 ExtClassLoader。(默认情况下,装载应用程序的类)
全盘负责委托机制:
JVM装载类时使用该机制。
“全盘负责”是指当一个ClassLoader装载一个类的时候,除非显示地使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入。
“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的路径中查找并装载目标类。(这一点是从安全角度考虑的,试想若有人编写了一个恶意的基础类如java.lang.String并装载到JVM中将会引起多么可怕的结果)
Java反射机制
Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法类等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.reflect包中定义。下面是最主要的3个反射类。
(1).Constructor:类的构造函数反射类。
getConstructors()
newInstance(Object initargs)
(2).Method:类的方法反射类。
getDeclaredMethods()
(3).Field:类的成员变量的反射类。
getDeclaredFields()
set(Object obj, Object value)
通过类的实例变量无法在外部访问私有变量、调用私有方法的。但是通过反射却可以绕过这个限制。在访问private、protected成员变量和方法时必须通过setAccessible(boolean access)方法取消Java语言检查,否则将抛出IllegalAccessException。如果JVM的安全管理器设置了相应的安全机制,调用该方法将抛出SecurityException。
----摘自Spring3.0