java类反射之method

    上一篇通过Class可以获取一个类的类模板了并且可以通过类模板成功的创造出了对象,但是止步于此是没有意义的因为单纯的拿到对象而不去做具体的事对一个对象来说它是很伤心的,下面就看看怎么能取得method来让我们的对象做具体的事。

    写一个student类,它有两个方法 一个是say()方法 一个是run方法

public class Student {

	public String say(String words){
		System.out.println("这位同学说了:"+words);
		return words;
	}
	
	public void run(int distance){
		System.out.println("这位同学跑了:"+distance+"km");
	}
	
}

    我们可以通过Method这个类来获取Student中方法的模板

public class Test {
	public static void main(String[] args) {
		try {
			Class clazz=Class.forName("com.tl.referce.Student");
			System.out.println("method:");
			Method methods1[]=clazz.getMethods();
			for (Method method : methods1) {
				System.out.print(method.getName()+"\t");
			}
			System.out.println();
			System.out.println("declare methods:");
			Method methods2[]=clazz.getDeclaredMethods();
			for (Method method : methods2) {
				System.out.print(method.getName()+"\t");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

    输出结果是:

    method:

    run say wait wait wait equals toString hashCode getClass notify notifyAll

    declare methods:

    run say

    从输出结果上可以看出clazz.getMethods()这个方法他获取的是该类的所有方法包含了从父类继承的方法,而clazz.getDeclaredMethods()这个方法只获取它自己的方法而不包含从父类继承的方法

    那么我们现在获取到了类的方法的模板,那么怎么才能执行该类的方法呢?

public class Test {
	public static void main(String[] args) {
		try {
			Class clazz=Class.forName("com.tl.referce.Student");
			Method methods1[]=clazz.getMethods();
			System.out.println();
			Method methods2[]=clazz.getDeclaredMethods();
			
			try {
				Student student1=(Student) clazz.newInstance();
				Method method=clazz.getDeclaredMethod("say", new Class[]{String.class});
				method.invoke(student1, "hello world");
			} catch (InstantiationException e1) {
				e1.printStackTrace();
			} catch (IllegalAccessException e1) {
				e1.printStackTrace();
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}
    我们通过 Method method=clazz.getDeclaredMethod("say", new Class[]{String.class});来获取clazz中一个名叫say的方法的method模板然后通过method的invoke方法来执行student的say方法,当然还需要传递两个参数,第一个参数说明你需要执行的是那个对象中的方法,第二个参数是为你要执行的方法传递对应的参数。


转载于:https://my.oschina.net/u/2260218/blog/513504

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值