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

你可能感兴趣的:(overload,override)