反射中,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() 可能更适合使用。
阅读全文