Java面试基础篇——第十一篇:Class.forName和ClassLoader的区别
2018-07-25 10:08
387 查看
Java中的
来看看
OK, 到这我们来做个小小的测试
Test和Test2的代码
看看执行的结果
发现ClassLoader并不会执行static代码块,而Class.forName()才会执行对类的初始化,这也就验证了文章开始我们所阐述的观点。
Class.forName()和
ClassLoader都可以用来对类进行加载。
Class.forName()除了将类的.class文件加载到JVM中 还会对类进行解释,执行类中的static块,而
ClassLoader只会将.class文件加载到JVM,不会执行static块,只有在newInstance的时候才执行static块。
Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法才会调用构造函数,创建类的对象。
来看看
Class.forName()的源码
@CallerSensitive public static Class<?> forName(String className) throws ClassNotFoundException { Class<?> caller = Reflection.getCallerClass(); //第二个参数 true,表示是否初始化,初始化就是执行static代码 return forName0(className, true, ClassLoader.getClassLoader(caller), caller); }
OK, 到这我们来做个小小的测试
public class Main { private static final String CLASS_NAME_1 = "com.developlee.springmvclearn.test.Test"; private static final String CLASS_NAME_2 = "com.developlee.springmvclearn.test.Test2"; public static void main(String[] args) throws Exception { testClassLoader(CLASS_NAME_1, CLASS_NAME_2); System.out.println("上面测试ClassLoader 下面测试Class.forName()"); testClassForName(CLASS_NAME_1, CLASS_NAME_2); } private static void testClassLoader(String class1, String class2){ Class<?> clazz1; Class<?> clazz2; ClassLoader classLoader = ClassLoader.getSystemClassLoader(); try { clazz1 = classLoader.loadClass(class1); clazz2 = classLoader.loadClass(class2); System.out.println("Class1: " + clazz1.getSimpleName() + ", Class2: " + clazz2.getSimpleName()); }catch (Exception e){ e.printStackTrace(); } } private static void testClassForName(String class1, String class2){ try { Class clazz1 = Class.forName(class1); Class clazz2 = Class.forName(class2); System.out.println("Class1: " + clazz1.getSimpleName() + ", Class2: " + clazz2.getSimpleName()); }catch (Exception e){ e.printStackTrace(); } } }
Test和Test2的代码
public class Test { static { System.out.println("静态代码块执行了..."); } } public class Test2 { static { System.out.println("Test2 static code blocks is running !"); } }
看看执行的结果
Class1: Test, Class2: Test2 上面测试ClassLoader 下面测试Class.forName() 静态代码块执行了... Test2 static code blocks is running ! Class1: Test, Class2: Test2 Process finished with exit code 0
发现ClassLoader并不会执行static代码块,而Class.forName()才会执行对类的初始化,这也就验证了文章开始我们所阐述的观点。
相关文章推荐
- java反射中,Class.forName和classloader的区别
- Java中class是如何加载到JVM中的(Class.forName("name")和ClassLoader.loadClass("name")的区别)
- JAVA的Class.forName(clsName)ClassLoader的loadClass(clsName)的区别
- java反射中,Class.forName和classloader的区别(代码说话)
- 在Java的反射中,Class.forName和ClassLoader的区别
- Java:Class.forName()与ClassLoader.loadClass()的区别
- Java 反射中,class.forName()和classLoader的区别
- java反射——Class.forName和classloader的区别
- Java基础面试题6-Java反射中Class.forName和classloader的区别
- java零碎要点---class()、getClass()、Class.forName()、getClassLoader()的区别和联系--又不详细的地方求补充
- java零碎要点---class()、getClass()、Class.forName()、getClassLoader()的区别和联系--又不详细的地方求补充
- java反射中,Class.forName和classloader的区别(代码说话)
- Java中class是如何加载到JVM中的(Class.forName(&quot;name&quot;)和ClassLoader.loadClass(&quot;name&quot;)的区别)
- java两种反射的区别 - Class.forName()和ClassLoader.loadClass()
- java反射中,Class.forName和classloader的区别
- Java中.class,class.forName(),getClass()的区别
- ClassLoader.loadClass和Class.forName的区别
- Class-forName和ClassLoader的区别
- java反射(1) 之class.forName(""), 类名.class, 对象.getClass()区别
- Class.forName()与ClassLoader.loadClass()的区别