getMethods()和getDeclaredMethods()区别

虽然是老生常谈了,但是还是要先说一下两者的区别。
getMethods():能够获取类的所有public方法,包括自身定义的以及从父类继承的。
getDeclaredMethods():能够获取类本身的所有方法,包括private方法,实现的接口方法,但是不能获取从父类继承的非public方法。
因此getDeclaredMethods()使得我们能够在其他类操作private方法,代码更加的灵活,不过尽量少用就是了。

操作父类的非public方法

有点标题党= =,因为自己看到这两个方法定义的时候发现两个方法的盲点:继承自父类的protected方法和default方法都无法被反射获取,可是子类也确实能够使用它们。防止大家困惑这个问题以及自己做笔记,才写了这篇文章。
经过查询资料发现:这两个方法确实不能直接操作父类的protected和defaulted方法

//父类 
public class ParentDemo {
   
     
 
    public String parentPbulic(){
   
     
        return null; 
    } 
    protected String parentProtect(){
   
     
        return null; 
    } 
    String parentDefault(){
   
     
        return null; 
    } 
    private String parentPrivate(){
   
     
        return null; 
    } 
} 
//子类 
public class Demo extends ParentDemo {
   
     
 
    public String publicDemo(){
   
     
        return null; 
    } 
 
    protected String protectedDemo(){
   
     
        return null; 
    } 
 
    String defaultDemo(){
   
     
        return null; 
    } 
    private String privateDemo(){
   
     
        return null; 
    } 
} 
//验证 
public class TestDemo {
   
     
    public static void main(String[] args){
   
     
        Class clazz = Demo.class; 
 
        System.out.println("=========children getDeclaredMethods============"); 
        Method[] methods = clazz.getDeclaredMethods(); 
        for(Method method : methods){
   
     
            System.out.println(method.getName()); 
        } 
 
        System.out.println("=========children getMethods============"); 
        Method[] methods2 = clazz.getMethods(); 
        for(Method method : methods2){
   
     
            System.out.println(method.getName()); 
        } 
 
 
        Class Pclazz = clazz.getSuperclass(); 
 
        System.out.println("===========parent getDeclaredMethods======"); 
        Method[] pmethods = Pclazz.getDeclaredMethods(); 
        for(Method method : pmethods){
   
     
            System.out.println(method.getName()); 
        } 
    } 
} 
//结果 
=========children getDeclaredMethods============ 
protectedDemo 
defaultDemo 
privateDemo 
publicDemo 
=========children getMethods============ 
publicDemo 
parentPublic 
wait 
wait 
wait 
equals 
toString 
hashCode 
getClass 
notify 
notifyAll 
===========parent getDeclaredMethods====== 
parentPrivate 
parentDefault 
parentPublic 
parentProtect 

可以看出,要想操作父类的default和protected方法,只能通过getSuperClass先获取到父类的class对象,然后再进行操作。
我的理解是,因为default和protected方法虽然子类也可以操作,但方法实际归属还是属于父类,所以无法直接用子类获得,而public方法是完全没限制,所以就无所谓了,当然这只是为了自己方便理解哈哈。
我们这里讲的虽然只是方法,但是变量其实也一样,getFields()和getDeclaredFields()就不在赘述了。
这个理解只是一家之言,如果有不同意见欢迎指出。

评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!