反射机制必定用到Class.forName 这个方法。上周有个同事在分享这块的时候延展的谈到了Class.forName的一些用法。
1、Class.forName(String className);
2、Class.forName(String name,boolean initialize,ClassLoader loader);
通常大家都会认为,某个类中的static初始化区块都是在类加载
的时候就被调用到唯一的一次。真的是这样么?带着这个问题,我们来看看Class.forName这个方法。
public class Word {
static{
System.out.println("Word Init....");
}
}
public class Test {
public static void main(String[] args) {
try{
Class cls = Class.forName("Word",false,ClassLoader.getSystemClassLoader());
}catch(Exception e){
e.printStackTrace();
}
}
}
public class Test1 {
public static void main(String[] args) {
try{
Class cls = Class.forName("Word",true,ClassLoader.getSystemClassLoader());
}catch(Exception e){
e.printStackTrace();
}
}
}
类Test和Test1运行的结果不一样:
Test:
Test1:Word Init...
为什么会这样?
Class.forName中的第二个参数在发生着作用。
不管用new还是class.forName来产生实例都隐含着两个部分:类加载+静态初始化区块调用;
静态初始化区块是在newInstance()的时候才被真正调用,所以Class.forName的第二个参数“false”的时候,定义不需要调用静态初始化区块,这就是为什么产生如上结果的原因了。
给一些应聘来工程师问这个问题,大家的回答多为静态初始化区块在类加载的时候被调用的。真正的是:静态初始区块并不是类加载的时候就调用,而是在第一次实例化的时候真正被调用
。
分享到:
相关推荐
Java中的`Class.forName()`方法是一个非常关键的工具,主要用于动态加载类。它的作用在于根据给定的类全名(包括包名)返回对应的`Class`对象。`Class`对象是Java反射机制的基础,它代表着运行时的类信息,可以通过...
此外,`Class.forName()`方法还有其他重载形式,如`forName(String className, boolean initialize, ClassLoader loader)`,它允许你控制是否初始化类以及使用哪个类加载器进行加载。 总的来说,`Class.forName()`...
在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...
1. **使用方式**:`Class.forName`是直接使用的静态方法,而`ClassLoader`是面向对象的,需要实例化。 2. **功能**:`Class.forName`不仅加载类,还执行类的初始化;`ClassLoader`只负责加载类,不初始化。 3. **...
Class.forName()方法的用法可以分为两种,一种是使用Class.forName()方法加载类,然后使用newInstance()方法实例化该类,另一种是使用new关键字实例化类。两种方法的效果是一样的,但是它们的实现机制不同。Class....
在Java编程语言中,`Class.forName()`方法是一个非常重要的功能,它主要用于动态加载类到Java虚拟机(JVM)中。这个方法的主要作用是根据给定的全限定类名(包括包名和类名)来查找并加载对应的类。下面我们将深入...
使用 abstract class 的方式定义抽象类可以有自己的数据成员,也可以有非 abstract 的成员方法,而使用 interface 的方式定义抽象类只能有静态的不能被修改的数据成员(也就是必须是 static final 的),所有的成员...
### Class.forName 的用法详解 #### 一、概述 `Class.forName` 是 Java 反射 API 中的一个重要方法,主要用于动态加载类。该方法的主要作用是根据提供的全限定类名来加载并返回对应的 `Class` 对象。在 Java 开发...
首先,`Class.forName("className")` 是一个静态方法,它用于在运行时动态加载指定的类。它的主要作用是告诉Java虚拟机(JVM)去查找并加载类。如果类尚未被加载到内存中,JVM会按照类路径去寻找对应的`.class`文件...
使用类名.class 的方式获取 Class 对象时,不会做类的初始化工作,而使用 class.forName() 的方式获取 Class 对象时,JVM 将装入类,并做类的静态初始化。使用 getClass() 的方式获取 Class 对象时,JVM 将对类进行...
在Java JDBC编程中,`Class.forName()` 方法起着至关重要的作用。它的主要任务是动态加载指定的类并执行其实例的静态初始化块。在上下文中,`Class.forName()` 被用来加载数据库驱动,比如MySQL的`...
`Class.forName()`方法内部调用了本地方法`forName0`,并传入了一个布尔参数`initialize`,默认值为`true`,表示在加载类之后执行初始化。初始化阶段不仅包括对类变量的赋值,还包括执行静态初始化块,对于父类也是...
- **Class.forName()**:用于加载特定的JDBC驱动类。 - **DriverManager.getConnection()**:用于建立到数据库的连接。 - **URL**:指定数据库的位置以及连接参数。 - **Connection**:表示与数据库之间的连接。 ##...
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 为数据库SID String user = "test"; String password = "test"; ...
通过Class类可以获取Class对象,获取Class对象有三种方式:通过Object类的getClass()方法、通过类名.class获取Class对象、通过Class类中的forName()方法。每种方式都有其特点和应用场景,掌握这些方式可以帮助开发者...
首先,让我们了解`Class.forName()`的基本用法。这个方法接收一个字符串参数,该参数是完全限定类名(包括包名),然后返回对应类的`Class`对象。一旦我们有了`Class`对象,就可以调用其方法来创建实例、获取字段和...
本文将深入探讨Java中动态加载类的基础知识,特别是`Class.forName`方法的使用,以及在扩展区(extensions)内调用`Class.forName`可能遇到的问题。 #### `Class.forName`:动态加载的核心 `Class.forName`方法是...
首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于根据全限定类名(包括包名)加载类。例如,如果我们有一个名为`Robot`的类,我们可以使用以下代码加载它: ```java Class<?> ...
通常,我们使用`Class.forName()`方法来加载驱动,例如: ```java Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ``` 如果这个方法抛出ClassNotFoundException,表示驱动类没有找到。 4. **...