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