针对以前看过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是一样的,程序实际上不知道会执行哪一个。