学习任务:

视频学习

Class类的作用

测试Class对象的三种获取方法

Java中有一个Class类,它用来描述Java中的每个类型。

查看Class类的源代码如下:

package java.lang;
...
public final class Class<T> implements java.io.Serializable,
                              GenericDeclaration,
                              Type,
                              AnnotatedElement {
                             ..

如何描述Java中的类型呢?

Java中每个类型在使用时JVM会创建唯一一个与之对应的Class对象,该Class对象记录了该类型的相关信息,比如:攀薄课堂的支付类PbAliPay.class在JVM中有一个与之对应的Class对象,String类在JVM中有一个与之对应的Class对象,所有类型都有一个且唯一一个与之对应的Class对象。

下边测试获取支付类PbAliPay.class的Class对象,用不同的方法获取到的Class对象它们是同一个。

package com.pbteach.javase.oop.reflect;

/**
 * Class类测试
 * @author 攀博课堂
 * @version v1.0
 */
public class TestClass {

	public static void main(String[] args) throws ClassNotFoundException {
		PbAliPay pbAliPay = new PbAliPay();
		//通过PbAliPay类的对象得到该类的Class对象
		Class<? extends PbAliPay> class1 = pbAliPay.getClass();
		System.out.println(class1);
		//也可以通过Class.forName()方法来创建Class对象
		Class<?> class2 = Class.forName("com.pbteach.javase.oop.reflect.PbAliPay");
		//测试内存中是否只有一个某类的Class对象,输出true表示class1和class2是同一个对象
		System.out.println(class1 == class2);
	}
}

要使用反射机制操作类首先需要得到类的Class对象,查看Class类的API,部分API如下:

// 返回所有构造方法对象的数组(包含私有的)
public Constructor<?>[] getDeclaredConstructors()	
// 返回单个公共构造方法对象
public Constructor<T> getConstructor(Class<?>... parameterTypes)	
// 返回单个公共成员变量对象
public Field getField(String name)		
// 返回所有公共成员方法对象的数组,包括继承的
public Method[] getMethods()												
// 返回所有成员方法对象的数组(包含私有的),不包括继承的
public Method[] getDeclaredMethods()
...

通过API可知,使用Class类对象可得到一个类的所有信息,包括:构造方法、成员变量、成员方法、父类、所实现的接口等对象,通过这些对象即可运行时操作一个类。

下边代码则是通过Class对象获取一个支付类PbAliPay.class对象。

//通过Class.forName()方法来获取PbAliPay类的Class对象
Class<?> class2 = Class.forName("com.pbteach.javase.oop.reflect.PbAliPay");
System.out.println(class1 == class2);
//通过Class对象构造PbAliPay对象
PbAliPay instance = (PbAliPay) class2.newInstance();
System.out.println(instance);

查询Class类的API,Class类的构造方法是私有的,所以不能通过new的方法来创建Class对象。当程序中去使用某个类时,会将类加载到JVM中,此时JVM会创建该类的Class对象,下边介绍三种获取Class对象的方法。

1、通过class对象的getClass()方法获取Class对象

任何类都直接或间接继承于Object,Object中有一个getClass()方法,使用此方法即可创建Class对象。

 public final native Class<?> getClass();

2、Class.forName()方法来获取Class对象

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

传入类的全限定名(包名加类名)即可创建某个类的Class对象。

3、通过静态变量class获取Class对象

每个类型(包括int等基本数据类型)都有一个class静态变量,通过此变量即可得到Class对象。

测试 代码如下:

package com.pbteach.javase.oop.reflect;

/**
 * Class类测试
 * @author 攀博课堂
 * @version v1.0
 */
public class TestClass {

	public static void main(String[] args) throws ClassNotFoundException {
		PbAliPay pbAliPay = new PbAliPay();
		//通过PbAliPay类的对象得到该类的Class对象
		Class<? extends PbAliPay> class1 = pbAliPay.getClass();
		System.out.println(class1);
		//也可以通过Class.forName()方法来创建Class对象
		Class<?> class2 = Class.forName("com.pbteach.javase.oop.reflect.PbAliPay");
		System.out.println(class1 == class2);
		
		String name = "www.pbteach.com";
		Class<? extends String> class3 = name.getClass();
		//通过class静态变量得到Class对象
		Class<? extends String> class4 =  String.class;
		System.out.println(class3 == class4);
	}
}

提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题