`
hzcaixiao
  • 浏览: 35064 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Class.forName的用法

 
阅读更多

反射机制必定用到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方法的作用详解

    Java中的`Class.forName()`方法是一个非常关键的工具,主要用于动态加载类。它的作用在于根据给定的类全名(包括包名)返回对应的`Class`对象。`Class`对象是Java反射机制的基础,它代表着运行时的类信息,可以通过...

    Class.forName

    此外,`Class.forName()`方法还有其他重载形式,如`forName(String className, boolean initialize, ClassLoader loader)`,它允许你控制是否初始化类以及使用哪个类加载器进行加载。 总的来说,`Class.forName()`...

    class literal & instance.getClass() & Class.forName(String className)

    在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...

    在Java的反射中,Class.forName和Class

    1. **使用方式**:`Class.forName`是直接使用的静态方法,而`ClassLoader`是面向对象的,需要实例化。 2. **功能**:`Class.forName`不仅加载类,还执行类的初始化;`ClassLoader`只负责加载类,不初始化。 3. **...

    Java Class.forName()用法和newInstance()方法原理解析

    Class.forName()方法的用法可以分为两种,一种是使用Class.forName()方法加载类,然后使用newInstance()方法实例化该类,另一种是使用new关键字实例化类。两种方法的效果是一样的,但是它们的实现机制不同。Class....

    java中Class.forName的作用浅谈

    在Java编程语言中,`Class.forName()`方法是一个非常重要的功能,它主要用于动态加载类到Java虚拟机(JVM)中。这个方法的主要作用是根据给定的全限定类名(包括包名和类名)来查找并加载对应的类。下面我们将深入...

    class.forname的作用 详细解析抽象类和接口的区别

    使用 abstract class 的方式定义抽象类可以有自己的数据成员,也可以有非 abstract 的成员方法,而使用 interface 的方式定义抽象类只能有静态的不能被修改的数据成员(也就是必须是 static final 的),所有的成员...

    Classfor的用法

    ### Class.forName 的用法详解 #### 一、概述 `Class.forName` 是 Java 反射 API 中的一个重要方法,主要用于动态加载类。该方法的主要作用是根据提供的全限定类名来加载并返回对应的 `Class` 对象。在 Java 开发...

    Class.forName()_newInstance()_New_三者区别

    首先,`Class.forName("className")` 是一个静态方法,它用于在运行时动态加载指定的类。它的主要作用是告诉Java虚拟机(JVM)去查找并加载类。如果类尚未被加载到内存中,JVM会按照类路径去寻找对应的`.class`文件...

    浅谈java中类名.class, class.forName(), getClass()的区别

    使用类名.class 的方式获取 Class 对象时,不会做类的初始化工作,而使用 class.forName() 的方式获取 Class 对象时,JVM 将装入类,并做类的静态初始化。使用 getClass() 的方式获取 Class 对象时,JVM 将对类进行...

    jdbc中class.forname的作用

    在Java JDBC编程中,`Class.forName()` 方法起着至关重要的作用。它的主要任务是动态加载指定的类并执行其实例的静态初始化块。在上下文中,`Class.forName()` 被用来加载数据库驱动,比如MySQL的`...

    浅析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")

    `Class.forName()`方法内部调用了本地方法`forName0`,并传入了一个布尔参数`initialize`,默认值为`true`,表示在加载类之后执行初始化。初始化阶段不仅包括对类变量的赋值,还包括执行静态初始化块,对于父类也是...

    jdbc驱动程序实例

    - **Class.forName()**:用于加载特定的JDBC驱动类。 - **DriverManager.getConnection()**:用于建立到数据库的连接。 - **URL**:指定数据库的位置以及连接参数。 - **Connection**:表示与数据库之间的连接。 ##...

    java于各种数据库连接额语句

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // orcl 为数据库SID String user = "test"; String password = "test"; ...

    Java中通过Class类获取Class对象的方法详解

    通过Class类可以获取Class对象,获取Class对象有三种方式:通过Object类的getClass()方法、通过类名.class获取Class对象、通过Class类中的forName()方法。每种方式都有其特点和应用场景,掌握这些方式可以帮助开发者...

    forname实现工程内部反射机制

    首先,让我们了解`Class.forName()`的基本用法。这个方法接收一个字符串参数,该参数是完全限定类名(包括包名),然后返回对应类的`Class`对象。一旦我们有了`Class`对象,就可以调用其方法来创建实例、获取字段和...

    White paper

    本文将深入探讨Java中动态加载类的基础知识,特别是`Class.forName`方法的使用,以及在扩展区(extensions)内调用`Class.forName`可能遇到的问题。 #### `Class.forName`:动态加载的核心 `Class.forName`方法是...

    Java反射简单例子

    首先,我们从`Class.forName()`方法开始。这是Java反射机制的一个关键入口点,它用于根据全限定类名(包括包名)加载类。例如,如果我们有一个名为`Robot`的类,我们可以使用以下代码加载它: ```java Class<?> ...

    Cannot load JDBC driver class 'com.microsoft.sqlserver.jdbc.SQLServerDriver'

    通常,我们使用`Class.forName()`方法来加载驱动,例如: ```java Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ``` 如果这个方法抛出ClassNotFoundException,表示驱动类没有找到。 4. **...

Global site tag (gtag.js) - Google Analytics