关于Java类加载器,我们都知道Java虚拟机有很多的类加载器,什么什么哦,这里说EXT 加载器,主要是加载EXT中的jar包中的类,而系统类加载器是我们在代码中使用的类的加载,很显然EXT加载器在JVM启动的时候就已经加载了,在整个JVM中只会存在一个EXT加载器加载的类,而我们使用系统类加载器价值的类,再我们重新调用该类的时候也许会重新加载,或许不会,谁知道呢?起码我知道domino代理每次运行都会使用系统加载器加载该类,而EXT只会在代理JVM启动的时候加载一次,似乎不符合我们以前学的知识,谁知道IBM是怎么做的。
对于EXT加载器加载的类,和系统类加载的类,两者是不相同的,也就是加载了两个该类的Class对象,比如说ext jar包中的com.you.Test类和我们自定义的com.you.Test类会在使用的时候加载两个类Class对象,他们生成的对象是不相等的。
如果我们这边定义了一个com.you.Test类,然后ext jar包里面有一个类用来持有该类对象(暂时叫test),OK,当我们的加载的com.you.Test的Class类对象被回收后,我们将无法把test对象转化成com.you.Test对象了,使用 test instanceof com.you.Test也会返回false,这是因为我们没有一个全局的com.you.Test的Class对象,当我们的程序再一次加载com.you.Test的Class对象时,test 已经不是这个Class对象的实例了。
完全的确定一个对象,是通过 类加载器+包名+类名,不同的加载器加载的类,哪怕包名和类名完全一致,他们也不是同一种类型,因为不同的类加载器分别加载了该类,生成了不同的Class对象。
思路混乱,不知所云,但也算有感