forName 和.class
package com.example.demo.reflact; public class A { public static String cc = "cccc"; static { cc="32323232"; System.out.println("静态初始化2322323"); } public void hello() { System.out.println("hello world"+cc); } }
区别:
(1)Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
(2)而classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
#Class.forName(name,initialize,loader)带参数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象。
ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”,获取到二进制流后放到JVM中。Class.forName()方法实际上也是调用的CLassLoader来实现的。
作者:代码之尖
链接:https://www.jianshu.com/p/2dbfec55c987
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
package com.example.demo.reflact; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class TestClassLoad { public static void main(String[] args) throws Exception { // m1(); // m2(); m3(); // m4(); return; } private static void m4() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { A a = new A(); Class<?> clz = a.getClass(); Object o = clz.newInstance(); Method m = clz.getDeclaredMethod("hello", null); m.invoke(o); } private static void m3() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Class<?> clz = A.class; Object o = clz.newInstance(); Method m = clz.getDeclaredMethod("hello", null); m.invoke(o); } private static void m2() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Class<?> clz = Class.forName("com.example.demo.reflact.A"); Object o = clz.newInstance(); Method m = clz.getDeclaredMethod("hello", null); m.invoke(o); } private static void m1() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Class<?> clz = Class.forName(A.class.getName()); Object o = clz.newInstance(); Method m = clz.getDeclaredMethod("hello", null); m.invoke(o); } }