getMethods

针对以前看过override和overload的区别,正面理解起来很容易,最近看了reflect之后也可以用另外一种思路理解,也许这样理解更彻底些。
首先是引用博客里的:
getDeclaredMethod*()获取的是类自身声明的所有方法,包含public、protected和 private方法。getMethod*()获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。要获得父类的不是public的方法只有递归到父类再getDeclaredMethod*(),要是invoke父类的私有或者普通(不是public)的方法需要设置method.setAccessible(true)。



import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class cl {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
cl c=new cl();
try {

//c.getClass().getMethod("prt", a.class).invoke(c, new a());
// Method[] mm= c.getClass().getMethods();//这里得到11个
// length :11
// name prt
// name main
// name wait
// name wait
// name wait
// name hashCode
// name getClass
// name equals
// name toString
// name notify
// name notifyAll

Method[] mm= c.getClass().getDeclaredMethods();//这里得到自身类里的方法,共3个
// length :3
// name prt
// name main
// name p

System.out.println("length :"+mm.length);
for(Method m1:mm){
String sss= m1.getName();
System.out.println("name "+sss.toString());
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void prt(a s){
s.p();
}
private void p(){

}
}




下面关于invock():


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class cl {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
cl c=new cl();
try {

try {
c.getClass().getMethod("prt", a.class).invoke(c, new a());
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void prt(a s){//这里a是一个类
s.p();
}
private void p(){

}
}

第一个参数是方法名prt,
c.getClass().getMethod("prt", a.class).invoke(c, new a());
并且prt必须是c中的共有方法
第二个参数是传入该方法中的参数class[]集合, c是指调用该方法的实例,new a()是指该方法的具体参数值


这里需要说明的是要传入的是8种基本类型class[]也要是他们的封装类型集合, 另外就是如果不是public方法,调用会有异常。


说明 :overload的参数为什么要类型不一样,就是这里class[]能看出来的 ,如果类型一样的也可以覆盖,那么这里class是一样的,程序实际上不知道会执行哪一个。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值