package org.fenixsoft.jvm.chapter7;
/**
* @author zzm
*/
import java.io.IOException;
import java.io.InputStream;
/**
* 类加载器与instanceof关键字演示
*
* @author zzm
*/
public class ClassLoaderTest {
public static void main(String[] args) throws Exception {
ClassLoader myLoader = new ClassLoader() {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
try {
String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
InputStream is = getClass().getResourceAsStream(fileName);
if (is == null) {
return super.loadClass(name);
}
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name, b, 0, b.length);
} catch (IOException e) {
throw new ClassNotFoundException(name);
}
}
};
Object obj = myLoader.loadClass("org.fenixsoft.jvm.chapter7.ClassLoaderTest").newInstance();
System.out.println(obj.getClass().getClassLoader());
System.out.println(obj.getClass());
System.out.println(obj instanceof org.fenixsoft.jvm.chapter7.ClassLoaderTest);
}
}
运行结果如下:
可见使用了当前的classLoader,且因为此时jvm中还有一个被应用程序类加载器加载的类,两者不同,所以是false;当注释掉loadClass代码,运行结果如下:
验证了上面的结论