日期:2014-05-20  浏览次数:20799 次

classloader问题

package com.uestc.classload;

import java.io.File;
import java.io.InputStream;

public class TestClassIdentity {

static String classDataRootPath = "E:\\MyEclipse 10\\OOM\\bin";

public static String classNameToPath(String className) {
return classDataRootPath + File.separatorChar
+ className.replace('.', File.separatorChar) + ".class";
}

public static void main(String[] args) throws Exception{

ClassLoader classLoader = new ClassLoader() {

@Override
public Class<?> loadClass(String name)
throws ClassNotFoundException {
try {
InputStream is = getClass().getResourceAsStream(classNameToPath(name));
if(is == null){
return super.loadClass(name);
}else{
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name, b, 0, b.length);
}
} catch (Exception e) {
// TODO: handle exception
}
return super.loadClass(name);
}

};

Object object = classLoader.loadClass("com.uestc.classload.TestClassIdentity").newInstance();

System.out.println(object.getClass());
System.out.println(object.getClass().getClassLoader());

System.out.println(object instanceof com.uestc.classload.TestClassIdentity);
}

}

在看Java虚拟机方面的书籍,碰见一个问题,即判断两个类是否相同,要同时看类以及类的加载器是否相同,通俗的说就是即使两个类都来源于一个class文件,但是加载他们的类加载器不同,那这两个类就必定不相等。如上代码所示,为什么输出的object的类加载器还是系统加载器?最后一个也是输出的true?
------解决方案--------------------
好像是类加载器找不到回一层层的找的。。