java的反射和它的类加载机制

1. java 的类装载系统: html

在java虚拟机中有两种类装载器: 启动类装载器 和 自定义类装载器。 前者是jvm的一部分,后者是java程序的一部分。不一样的类装载器放在不懂得命名空间中。 java

类转载子系统涉及java的其它几个部分,及来自lang库的类。好比自定义的类装载器必须派生自java.lang.ClassLoader。 ClassLoader中定义的方法为程序提供了访问类装载器机制的接口。 c++


其实在java内置的类装载器有三种。 api

1Bootstrap ClassLoader 此加载器采用c++编写,通常开发中不多见。 oracle

2Extension ClassLoader 用来进行扩展类的加载,通常对应的是jre\lib\ext目录中的类 jvm

3AppClassLoader 加载classpath指定的类,是最经常使用的加载器。同时也是java中默认的加载器。 spa

工做流程 装载:查找并装载类型的二进制数据。 orm

        连接: 验证 准备 解析
htm

        初始化 : 把类变量初始化为正确的初始值。
对象

类的ClassLoader 的 protected final Class findSystemClass(String name);接受一个字符串做为参数,

2. 反射射就是一面镜子   可以在镜子中看到 这个类中的“全部”的东西

有三种能够在程序中获得class对象的方式:
第一中就是 在编译时不知道其类名但在运行期能够获得该类名  使用class类的forname()静态方法得到class对象  如: class c=class.forname("获得的类名的全名  包括属于的工程,包");
第二中就是当咱们获得该类的一个对象咱们就能够直接用该对象的getclass();方法获得给类的class对象如:
   class c=对象名.getclass();
第三种就是咱们在运行 前就已经知道其类名的  能够直接使用类名.class来获得一个给类的class对象
如:  class c = 类名.class;

3. 反射装载过程: 

除了系统类,扩展库和classpath的自定义的装载,java还支持动态扩展,包括运行时决定使用的类型,装载,使用它们。经过反射的java.lang.Class 的forName()方法,或者用户自定义的loadClass()方法,均可以自动扩展java程序。

    对于Class。forName() 来说主要有两种形式:

static Class<?> forName(String className)
Returns the Class object associated with the class or interface with the given string name.
static Class<?> forName(String name, boolean initialize, ClassLoader loader)
Returns the Class object associated with the class or interface with the given string name, using the given class loader.
三参数的解释 若是initalize设为true,类型会在forName()方法返回前链接并初始化;若是是false,类型会被加载,可能会链接可是不会被明确的初始化。若是loader 为null则使用默认的加载器,也能够选用自定义的加载器。

两个forName()方法都返回Class实例的引用,表明被装载的类型。若是不能装载抛出ClassNotFoundException。

若是使用用户自定义的装载器,那么loadClass()方法就要调用 

Class<?> loadClass(String name)
Loads the class with the specified   binary name .
protected Class<?> loadClass(String name, boolean resolve)
Loads the class with the specified   binary name .
这两个方法来装载新的请求的类型,若是找不到,会抛出ClassNotFoundException 异常。



类装载的反向查找是去已经加载的类库中寻找权限定名的过程,若是没有就从新动态扩展,(就像一个map的映射方式去找的。)前提是类已经编译成class的字节码文件。

相关文章
相关标签/搜索