1.5 通过类对象表示类型
Java 反射使用 Class 类的实例表示 类型,例如 getMethod(String name, Class[] paramTypes) 方法,使用一个 Class 数组表示 name 方法接受的参数类型列表。
当参数是对象时没有问题,但如果参数 不是对象 呢?
public class Vector ... {
public synchronized boolean addAll( Collection c ) ...
public synchronized void copyInto( Object[] anArray ) ...
public synchronized Object get( int index ) ...
}
上面是 java.lang.Vector 类中的片段,其中的三个方法分别具有不同类型的参数:
- 接口
Collection - 数组
Object[] - 原始类型
int
要使用反射编程,就必须知道在这类方法上如何使用自省。
对于原始类型、数组、接口,Java 通过引入 Class 对象(Class 对象就是普通类)来表示,这些 Class 对象与普通 Class 对象相比有很多 局限性*,比如无法创建原始类型、接口的实例,但它们对于自省而言非常重要,Class 中支持 类型表示 的方法如下表所示:
| 方法 | 说明 |
|---|---|
| String getName() | 返回 Class 对象的 全限定名 |
| Class getComponentType() | 若调用方法的 Class 对象代表数组,则返回 数组元素 的类型 |
| boolean isArray() | 如果调用方法的 Class 对象代表数组,则为 true |
| boolean isInterface() | 如果调用方法的 Class 对象代表接口,则为 true |
| boolean isPrimitive() | 如果调用方法的 Class 对象代表原始类型,则为 true |
下面分别介绍 Java 如何使用 Class 对象表示原始类型、数组和接口。