Java 反射基础

来源:互联网 发布:程序员 多屏幕 编辑:程序博客网 时间:2024/05/17 01:00
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
0 0
原创粉丝点击