适时选择 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也是成对出现,那这
两者之间有什么差别呢?看如下代码:
此段代码运行后的输出如下:
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,之后持续递归即可。
两者之间有什么差别呢?看如下代码:
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,之后持续递归即可。
相关文章推荐
- java集合源码解读---Queu和Stack的数组和链式实现
- 汇编语言第6章 宏与子程序
- Glide图片加载变形如何解决?
- error LNK2001: 无法解析的外部符号
- 黑马程序员——Java基础---面向对象
- 第七次作业——团队作业——项目冲刺———第五天
- 文章标题
- 词法分析优化
- POJ1679-The Unique MST
- 前端构建工具之gulp的安装和配置
- 利用小波融合对由聚焦失败导致的图像模糊进行修复
- 日本的“电力路由器”概述
- 迟来的万圣节大餐 Fedora 23 正式发布
- cleancache
- Unity 中的gameObject 和 transform
- 关于strtus2上传问题
- cloudstack VM的高可用(HighAvailability)
- 输出九九乘法口诀表
- crosstool-ng在编译过程中遇到的问题
- C# 窗体加载完成才显示