JAVA反射使用父类的非public方法(getMethods()和getDeclaredMethods()区别)

本文介绍了Java中getMethods()和getDeclaredMethods()的区别,前者能获取类的所有public方法,包括继承的;后者能获取类本身所有方法,但不能获取父类非public方法。还指出操作父类的default和protected方法,需先获取父类class对象,变量获取方法同理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()就不在赘述了。
这个理解只是一家之言,如果有不同意见欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值