您的位置:首页 > 其它

适时选择 getDeclared X X X 和 get x X X

2015-11-04 19:22 176 查看
Java 的 Class 类提供了 很多的 getDeclaredX X X 方法和 getX X X 方法,例如 getDeclared-Method和 getMethod成对出现,getDeclaredConstructors 和 getConstructors也是成对出现,那这
两者之间有什么差别呢?看如下代码:

public class Client {
public static void main(String[] args) throws Exception {
String methodName="doStuff";
Method m1=Foo.class.getDeclaredMethod(methodName);//所有的   默认  void doStuff(){}
Method m2=Foo.class.getMethod(methodName);//所有公用(public)方

}

static class Foo{
void doStuff(){}
}
}


此段代码运行后的输出如下:

Exceptionin thread "main" java.lang.NoSuchMethodException:Client$Foo.doStuff{} at java.lang.Class.getMethod(Class.java:1605) atClient.main(Client.java:10)

该异常是说m2变量的getMethod方法没有找到doStuff方法,明明有这个方法 呀,为什么没有找到呢?这是因为getMethod方法获得的是所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。,而getDeclaredMethod获得是自身类的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法,当然也包括它所实现接口的方法。而且不受限于访问权限。

其他的 getDeclaredConstructors 和 getConstructors、getDeclaredFields 和 getFieids 等与 此相似。Java之所以如此处理,是因为反射本意只是正常代码逻辑的一种补充,而不是让正常代码逻辑产生翻天覆地的变动,所以public的属性和方法最容易获取,私有属性和方法也 可以获取,但要限定本类。

那现在问题来了:如果需要列出所有继承自父类的方法,该如何实现呢?简单,先获得 父类,然后使用getDeclaredMethods,之后持续递归即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: