[改善Java代码]适时选择getDeclaredxxx和getxxx
2016-06-29 11:04
435 查看
Java的Class类提供了很多的getDeclaredxxx方法和getxxx方法,例如getDeclaredmethod和getMethod成对出现,getDeclaredConstructors和getConstructors也是成对出现.
那这两者有什么区别呢?
上面的异常是说m2变量的getMethod方法没有找到doStuff()方法,因为getMethod()方法获得的是所有public访问级别的方法,包括从父类继承的方法.
而getDeclaredMethod()方法获得的是自身类的所有方法,包括pulbic,private方法等,而且不受限于访问权限.
Java之所以这么处理,是因为反射本意只是正常代码逻辑的一种补充,而不是让正常代码逻辑产生翻天覆地的变化,所以pulbic的属性和方法最容易获取,私有属性和方法也可以获取,但是要限定本类.
如果要获得所有继承自父类的方法,如何实现?
先获得父类,然后使用getDeclaredMethods,之后持续递归即可.
那这两者有什么区别呢?
import java.lang.reflect.Method; public class Client { public static void main(String[] args) throws Exception { //方法名称 String methodName = "doStuff"; Method m1 = Foo.class.getDeclaredMethod(methodName); System.out.println(m1);//输出:void cn.summerchill.test.Client$Foo.doStuff() Method m2 = Foo.class.getMethod(methodName); System.out.println(m2);//抛出异常 Exception in thread "main" java.lang.NoSuchMethodException: cn.summerchill.test.Client$Foo.doStuff() } static class Foo { void doStuff() {} } }
上面的异常是说m2变量的getMethod方法没有找到doStuff()方法,因为getMethod()方法获得的是所有public访问级别的方法,包括从父类继承的方法.
而getDeclaredMethod()方法获得的是自身类的所有方法,包括pulbic,private方法等,而且不受限于访问权限.
Java之所以这么处理,是因为反射本意只是正常代码逻辑的一种补充,而不是让正常代码逻辑产生翻天覆地的变化,所以pulbic的属性和方法最容易获取,私有属性和方法也可以获取,但是要限定本类.
如果要获得所有继承自父类的方法,如何实现?
先获得父类,然后使用getDeclaredMethods,之后持续递归即可.
相关文章推荐
- springMVC_03_怎么做
- JAVA 注解
- Java集合---ArrayList的实现原理
- 学习记录 java session保存用户登录
- JAVA枚举类型enum使用实例
- JAVA的反射机制浅谈
- java反射之getGenericSuperclass方法的用处
- Spring Cloud Config 快速入门
- springMVC_01_是什么
- MyBatis入门第4天--MyBatis与Spring整合及逆向工程
- Ubuntu安装JDK
- java.net.UnknownHostException: XXXX Name or service not known
- [改善Java代码]注意Class类的特殊性
- [改善Java代码]数组的真实类型必须是泛型类型的子类型
- [改善Java代码]严格限定泛型类型采用多重界限
- eclipst java heap space
- Java中字符串常量和字符串变量的区别
- Spark运行在eclipse_使用PyDev和pyspark
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
- RuntimeException与CheckedException