反射中,Class.forName和classloader的区别?[中高]

版权声明:No Rain No Rainbow https://blog.csdn.net/xiangyuenacha/article/details/84234625

相同点:
java中class.forName()和classLoader都可用来对类进行加载。
不同点:
class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,来创建类的对象,可以看下源码,jvm底层可以控制。

参考代码:ClassloaderAndForNameTest

// 测试Class.forName和classloader的区别
public class ClassloaderAndForNameTest {

	public static void main(String[] args) {
		String className = "com.cto.edu.basic.ClassLoadObject";
		System.out.println("以下是测试Classloader的效果:");
		testClassloader(className);

		System.out.println("========================");
		System.out.println("以下是测试Class.forName的效果:");
		testForName(className);
		
	}

	private static void testClassloader(String className) {
		Class<?> c;
		ClassLoader loader = ClassLoader.getSystemClassLoader();
		try {
			c = loader.loadClass(className);
			System.out.println("testClassloader: " + c.getName());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	private static void testForName(String className) {

		try {
			Class c = Class.forName(className);
			System.out.println("testForName:" + c.getName());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

猜你喜欢

转载自blog.csdn.net/xiangyuenacha/article/details/84234625
今日推荐