反射机制可以用来:

  1. 在运行中分析类的能力。
  2. 在运行中查看对象,例如,编写一个toString方法供所有类使用。
  3. 实现通用的数组操作代码。
  4. 利用Method对象,这个对象很像C++中的函数指针。

利用反射分析类的结构

在java.lang.reflect包中有三个类Field、Method和Constructor分别用于描述类的域、方法和构造器。

使用反射编写泛型数组代码

java.lang.reflect包中的Array类允许动态地创建数组。若要动态地扩展一个数组,如下所示

1
2
3
4
5
6
public static Object[] badCopyOf(Object[] a, int newLength)
{
Object[] newArray = new Object[newLength];
System.arraycopy(a, 0, newArray, 0, a.length);
return newArray;
}

若要扩展Employee[]数组,则在运行时会抛出java.lang.ClassCastException异常。将一个Employee[]临时转换成Object[]数组,然后再把它转换回来是可以的,但一个开始就是Object[]数组却永远不能转换成Employee[]数组。为编写这类通用的数组代码,需要创建与原数组类型相同的新数组。

1
2
3
4
5
6
7
8
9
10
public static Object goodCopyOf(Object a,int newLength)
{
Class c1 = a.getClass();
if(!c1.isArray()) return null;
Class componentType = c1.getComponentType();
int length = Array.getLength(a);
Object newArray = Array.newInstance(componentType, newLength);
System.arraycopy(a, 0, newArray, 0, length);
return newArray;
}

goodCopyOf方法可以用来扩展任意类型的数组,而不仅是对象数组。

参考
《Java核心技术卷一》