欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java Class 类的三种实例化模式

程序员文章站 2024-01-18 20:07:22
...

Class 类是描述整个类的概念, 所以也是整个反射的操作源头, 那么在使用Class 类的时候需要关注的依然是这个类的对象, 而这个类的对象的产生模式, 一共有三种:

1. 任何的实例化对象可以通过 Object 类中的 getClass() 方法取得 Class 类对象:

public final<?> getClass()
package com.cwq.beyond;
import java.util.Date;

public class TestDemo04 {
	public static void main(String[] args) {
		// 在反射的世界里, 
		Class<?> cls = new Date().getClass();
		System.out.println(cls.getName());
		System.out.println(cls);	
	}
}

注意:

在反射的世界里, 该方法中的泛型只能用 ? 来体现, 这时候可以理解为是调用 Object 类进行操作处理, 而如果写入实际的类型则会报错.

2. “类.class” : 直接根据某一个具体的类来取得Class 类的实例化对象;

package com.cwq.beyond;
import java.util.Date;

public class TestDemo04 {
	public static void main(String[] args) {
		// 在反射的世界里, 
		Class<?> cls = Date.class;  // 不需要实例化Date 类对象了
		System.out.println(cls.getName());
		System.out.println(cls);
	}
}

3. 使用 Class 类提供的方法:

public static<?> forName(String className)
                        throws ClassNotFoundException

使用 forName() 方法

package com.cwq.beyond;

public class TestDemo04 {
	public static void main(String[] args) throws ClassNotFoundException {
		// 在反射的世界里, 
		Class<?> cls = Class.forName("java.util.Date"); // 直接使用字符串描述要使用的类, 无需 import
		System.out.println(cls.getName());
		System.out.println(cls);
	}
}

在以上给出的三个方法里面我们会发现一个神奇的地方: 除了第一种形式会产生Date 类的实例化对象之外, 其他两种都不会产生 Date类的实例化对象, 于是, 取得了 Class 类对象有一个最直接的好处 : 可以直接通过反射实例化对象, 在Class 类中定义有如下一个方法:

public T newInstance()
              throws InstantiationException,
                     IllegalAccessException

反射实例化对象

package com.cwq.beyond;

public class TestDemo04 {
	public static void main(String[] args) throws Exception {
		// 在反射的世界里, 
		Class<?> cls = Class.forName("java.util.Date"); // 直接使用字符串描述要使用的类, 无需 import
		Object object = cls.newInstance();  // 实例化对象 :等价 new java.util.Date()
		System.out.println(cls.getName());
		System.out.println(cls);
	}
}

第二种实例化对象的方式

从上面代码发现除了关键字 new 之外, 对于对象的实例化对象有了第二种做法, 通过反射进行, 取得了Class 对象就意味着取得了一个指定类的操作权。