但行好事
莫论前程❤

Java 反射机制中 getMethod()和getDeclaredMethod()区别

今天在学习java反射机制时,遇了一个疑惑:

getMethod()和getDeclaredMethod()有啥区别

用反射getMethod()调用类方法时,发生NoSuchMethodException异常,

Exception in thread "main" java.lang.NoSuchFieldException: maxSpeed
    at java.lang.Class.getField(Class.java:1690)
    at com.smart.reflect.ReflectTest.initByDefaultConst(ReflectTest.java:43)
    at com.smart.reflect.ReflectTest.main(ReflectTest.java:51)
init car!!

后来发现:

  1. getField()调用公共方法,不能反射调用私有方法
  2. getDeclaredField()能够访问本类中定义的所有方法。

java api文档,其中详细说明如下:

  • Method getDeclaredMethod(String name, Class… parameterTypes)
    • 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法

    函数的声明格式:

    返回值类型  函数名 (参数1, 参数2, ...)
    

    可以省略参数名称,比如上面的sum函数声明可以写成这样:

    int sum(int, int);
    
  • Method[] getDeclaredMethods()
    • 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
  • Method getMethod(String name, Class… parameterTypes)          
    • 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法
  • Method[] getMethods()          
    • 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法
  • getDeclaredField(String name)          
    • 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 
  • getField(String name)
    • 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定公共成员字段。 
  • Field[] getDeclaredFields() 
    • 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。

总结

  • getDeclaredMethods(String name, Class… parameterTypes)getDeclaredField(String name) 可以获取的范围为所有
  • getMethod(String name, Class… parameterTypes)getField(String name)只可以获取到公共成员方法和字段. 即public 修饰的方法和字段
赞(2) 打赏
未经允许不得转载:刘鹏博客 » Java 反射机制中 getMethod()和getDeclaredMethod()区别
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏