您好,欢迎访问一九零五行业门户网

java类加载器和类反射使用示例

一、一个命令对应一个进程。
当我们启动一个java程序,即启动一个main方法时,都将启动一个java虚拟机进程,不管这个进程有多么复杂。而不同的jvm进程之间是不会相互影响的。这也就是为什么说,java程序只有一个入口——main方法,让虚拟机调用。而两个mian方法,对应的是2个jvm进程,启动的是两个不同的类加载器,操作的实际上是不同的类。故而不会互相影响。
二、类加载。
当我们使用一个类,如果这个类还未加载到内存中,系统会通过加载、连接、初始化对类进行初始化。
1、类加载:指的是将类的class文件读入jvm,并为之创建一个class对象。
2、类连接:指的是把类的二进制数据合并到jre中,这又分为3个阶段:
a)、校验:检查载入class文件数据的正确性。
b)、准备:给类的静态变量分配存储空间,并进行默认初始化。
c)、解析:将类的二进制数据中的符号引用替换成直接引用。
3、初始化:对类的静态变量、静态初始化块进行初始化。
(注意:一个final类型的静态属性,如果在编译时已经得到了属性值,那么调用该属性时,不会导致该类初始化,因为这个相当于使用常量;
使用classloader()方法,只是加载该类,并未初始化。)
三、类加载器。
类加载器就是负责将.class文件加载到内存中,并为之生成对应的java.lang.class对象,它负责加载所有的类,而一旦一个类被加载入jvm中,就不会被再次载入了。
在java中,一个类用其全限定类名(即包名+类名)作为标识。
而在jvm中,一个类用其全限定类名和其类加载器作为标识。
jvm运行时会产生3个classloader,分别为:bootstrapclassloader(根类加载器)、extclassloader(扩展类加载器)和appclassloader(系统类加载器)。uml结构如下:
其中,bootstrapclassloader负责加载jre的核心类库,它不是classloader的子类,使用c++编写,因此我们在java中看不到它,通过其子类的getparent()方法获取时,将返回null。bootstrapclassloader负责装载jre目标下的rt.jar、charsets.jar等java核心类库。
如图可知,extclassloader和appclassloader为classloader的子类。在api中看不到它们,他们位于rt.jar文件中。全限定类名分别为:
sun.misc.launcher$extclassloader 和 sun.misc.launcher$appclassloader.
其中,extclassloader负责装载jre扩展目录ext中jar包,而appclassloader负责装载classpath路径下的类包。
测试如下:
package com.stoptalking.crazy; public class testclassloader { public static void main(string[] args) { //获取当前线程的类装载器 classloader loader = thread.currentthread().getcontextclassloader(); //获取system类的类装载器 classloader loader1 = system.class.getclassloader(); //获取本类testclassloader的类装载器loader2 classloader loader2 = testclassloader.class.getclassloader(); //获取loader2的父类 classloader loader3 = loader2.getparent(); //获取loader2的父类的父类 classloader loader4 = loader3.getparent(); system.out.println(loader); system.out.println(loader1); system.out.println(loader2); system.out.println(loader3); system.out.println(loader4); } }
控制台输出:
//当前线程类获取的类加载器是appclassloader sun.misc.launcher$appclassloader@6b97fd //system类为根装载器加载,java中访问不到,所以为null null //本类的类加载器当然也是appclassloader sun.misc.launcher$appclassloader@6b97fd sun.misc.launcher$extclassloader@1c78e57 null
更多java类加载器和类反射使用示例。
其它类似信息

推荐信息