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的任何方法,只能通过反射去调用其方法。
对比 学习