反射中,Class.forName()和 ClassLoader.loadClass()的区别

时间: 2024-05-22 13:10:44 浏览: 117
Class.forName()和ClassLoader.loadClass()都可以用来加载类,但它们的实现方式略有不同。 Class.forName()方法会触发类的静态代码块,而ClassLoader.loadClass()方法不会。也就是说,如果使用Class.forName()加载一个类,那么这个类的静态代码块会被执行,而如果使用ClassLoader.loadClass()加载一个类,那么这个类的静态代码块不会被执行。 另外,Class.forName()方法还可以指定是否进行初始化(即是否执行静态代码块),以及使用哪个类加载器进行加载。而ClassLoader.loadClass()方法只能使用指定的类加载器进行加载。 因此,如果需要加载一个类并执行它的静态代码块,可以使用Class.forName()方法;如果只需要加载一个类但不需要执行它的静态代码块,可以使用ClassLoader.loadClass()方法。
相关问题

Class.forName和ClassLoade的区别代码

Class.forName和ClassLoader都可以用于加载类,但它们有一些区别。 Class.forName()方法会返回一个Class对象,而ClassLoader.loadClass()方法只会加载类,需要通过Class.forName()或者其他方式获取Class对象。 Class.forName()方法还可以执行类的静态块,ClassLoader.loadClass()方法不会执行静态块。 下面是一个简单的示例代码,说明Class.forName()和ClassLoader.loadClass()的区别: ``` public class Main { public static void main(String[] args) throws ClassNotFoundException { // 使用Class.forName()加载类 Class<?> cls1 = Class.forName("com.example.MyClass"); System.out.println("Class.forName()加载的类:" + cls1.getName()); // 使用ClassLoader.loadClass()加载类 ClassLoader classLoader = Main.class.getClassLoader(); Class<?> cls2 = classLoader.loadClass("com.example.MyClass"); System.out.println("ClassLoader.loadClass()加载的类:" + cls2.getName()); } } class MyClass { static { System.out.println("静态块执行了"); } } ``` 输出结果: ``` 静态块执行了 Class.forName()加载的类:com.example.MyClass ClassLoader.loadClass()加载的类:com.example.MyClass ``` 从输出结果可以看出,Class.forName()方法执行了静态块,而ClassLoader.loadClass()方法没有执行静态块。

ClassLoader.getSystemClassLoader().loadClass()和Class.forName()有什么区别

ClassLoader.getSystemClassLoader().loadClass() 和 Class.forName() 都可以用于动态加载类,但它们有一些区别。 1. 参数类型: - ClassLoader.getSystemClassLoader().loadClass() 方法接受一个字符串参数,表示要加载的类的全限定名。 - Class.forName() 方法接受一个字符串参数,表示要加载的类的全限定名,还可以接受一个可选的布尔值参数来指定是否执行静态代码块。 2. 类加载器: - ClassLoader.getSystemClassLoader().loadClass() 使用系统类加载器进行类的加载。 - Class.forName() 使用调用者的类加载器进行类的加载。如果调用者是由引导类加载器加载的类,则使用引导类加载器进行加载。 3. 初始化行为: - ClassLoader.getSystemClassLoader().loadClass() 方法只会加载类,不会执行静态代码块或初始化该类的静态成员。 - Class.forName() 方法默认会初始化该类,包括执行静态代码块和初始化静态成员。但是,如果将可选的布尔值参数设为 false,可以抑制初始化行为。 综上所述,ClassLoader.getSystemClassLoader().loadClass() 主要用于简单地加载类,而 Class.forName() 在加载类的基础上还可以执行更多的初始化行为。在一些特殊的情况下,如需要动态地加载并初始化类时,Class.forName() 可能更适合使用。
阅读全文

相关推荐