1.4 在运行时查询方法
前面的例子中,我们给 setObjectColor 方法传递了一个类型为 Object 的参数 obj,该方法只有在了解 obj 类型之后才能做自省,所以第一步是查询参数的类型:
Class cls = obj.getClass();
getClass 方法可以在运行时查询对象的类型,该方法经常用在反射程序的最开始,因为很多反射任务都需要查询对象的类型,getClass 方法定义在 java.lang.Object 对象中,所以任何 Java 对象都可以调用 getClass 方法。
getClass 方法返回 java.lang.Class 对象的一个实例,Class 对象的实例是 Java 中的元对象,我们使用 类对象(class object)来称呼 java.lang.Class 对象的实例。类对象是 Java 中最重要的元对象,因为所有 Java 程序都是由类组成的。
类对象提供关于类的域、方法、构造器、嵌套类等的元数据,还提供了关于继承层次的信息。
setObjectColor 方法发现参数的类型之后,方法通过该类型查询 setColor 方法:
Method method = cls.getMethod("setColor", new Class[]{ Color.class });
第一个参数是要查询的方法名字,第二个参数是类对象数组(an array of class objects),用来标志 setColor 方法的参数类型,本例中,setColor 参数为 Color 类型。
注意上面没有用 getClass 方法获取 Color 的类对象,因为 Color 只是一个类名,此时只能使用类字面值(class literals)的方式获取类对象,从语法上讲,任何 类名 后加 .class 都会得到一个类对象。
getClass方法:适用已知对象,获取对象的类对象。.class类型字面值:适用于 仅知道类型名,获取该类型名的类对象。
java.lang.Class 类还有其他方法,用于方法自省,这些方法的签名与返回值如列表 1.1 所示。这些方法都使用一个 Class 数组指定所查询方法的参数类型。
| 方法 | 描述 |
|---|---|
Method getMethod(String name, Class[] parameterTypes) |
返回表示 public 方法的 Method 对象,继承、自身声明 皆可 |
| Method[] getMethods() | 返回 Method 数组,包含所有 public 方法,继承、声明皆可 |
Method getDeclaredMethod(String name, Class[] parameterTypes) |
返回表示 自身声明 的方法的 Method 对象 |
| Method[] getDeclaredMethods() | 返回 Method 数组,表示该类 声明 的所有方法,包括 public/private/protected/package 方法 |
注意
- 若
getMethod/getDeclaredMethod查询的方法并无参数,则可以传递null作为第二个参数,效果与传递一个空的java.lang.Class数组相同。 getMethod只返回public方法,可以是 继承 或者 自身声明 的。getDeclaredMethod返回所有方法,包括public/protected/private/package方法,但只能是 自身声明 的。
上面四个方法,都可能抛出 NoSuchMethodException:
- 使用
getDeclatedMethod查询 继承 自父类的方法。 - 使用
getMethod查询非public方法。
获取到 Method 对象之后,就可以通过该对象获取方法的信息,甚至调用方法。