java类加载器-(1)
package vmrun;
import java.io.InputStream;
public class ClassLoadTest {
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 (Exception e) {
throw new ClassNotFoundException(name);
}
}
};
Object object= myLoader.loadClass("vmrun.InvokeDynamicTest").newInstance();
System.out.println(object.getClass()) ;
System.out.println(object instanceof vmrun.InvokeDynamicTest);
}
}
输出
class vmrun.InvokeDynamicTest
false
这里我们得到的Class对象是CLassLoader可以识别的类,而InvokeDynamicTest是程序执行后可以识别的类,此时仅仅装载了InvokeDynamicTest的程序代码,还没有创建出其对象 ,接下来可以使用Class.newInsance()方法来调用InvokeDynamic类的构造方法,并返回一个真正的InvokeDynamicTest对象。
但是我们不能直接去调用 InvokeDynamicTest的任何方法,只能通过反射去调用其方法。
对比 学习
DexClassLoader使用-(1)

浙公网安备 33010602011771号