Java Class 类的三种实例化模式

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

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

public final Class<?> 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 对象就意味着取得了一个指定类的操作权。

猜你喜欢

转载自blog.csdn.net/Beyond_Nothing/article/details/112039919