A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Morgan 中级黑马   /  2015-7-5 20:46  /  717 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.Method类代表某个类中的一个成员方法,方法是属于一个类的。我们调用一个方法是用一个对象去调用,那么如果用反射的方法一定也是在对象上调用。先得到某个方法然后在针对某个对象调用。
2.使用Class类的方法getMethod(String name, Class<?>... parameterTypes)来得到Method对象,代表类中的方法。如果方法是无参的Class<?>可变参数列表列表可以连同前面的逗号一并省略。如果方法是私有的那么就不能使用getMethod方法,而因该使用getDeclaredMethod(String name, Class<?>... parameterTypes)方法,然后在调用之前先设置这个方法为可访问的,通过使用Method的setAccessible(boolean flag)方法。
3.得到方法后如何调用呢?使用Method的invoke(Object obj, Object... args)方法调用。注意如果方法是空参数的同理可变参数列表和前面的逗号可以一同省略。如果是静态方法那么obj用null代替,表示静态方法是属于类的,所以静态方法不用再对象上调用。
4.下面的小程序演示了如何使用
  1. public class Car
  2. {
  3.         public void run()
  4.         {
  5.                 System.out.println("Car run ...");
  6.         }
  7.         public static void printName()
  8.         {
  9.                 System.out.println("宝马");
  10.         }
  11.         private void printColor()
  12.         {
  13.                 System.out.println("Color is Red.");
  14.         }

  15. }
复制代码
  1. import java.lang.reflect.InvocationTargetException;
  2. import java.lang.reflect.Method;

  3. public class TestMain
  4. {

  5.         public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
  6.         {
  7.                 Car c= new Car();
  8.                 Method m1 = c.getClass().getMethod("run");
  9.                 m1.invoke(c);//Car run ...
  10.                 System.out.println("-------------------------");
  11.                 Method m2 = c.getClass().getDeclaredMethod("printColor");
  12.                 m2.setAccessible(true);
  13.                 m2.invoke(c);//Color is Red.
  14.                 System.out.println("-------------------------");
  15.                 Method  m3 = c.getClass().getMethod("printName");
  16.                 m3.invoke(null);//宝马
  17.         }

  18. }
复制代码





2 个回复

倒序浏览
m3.invoke(null);//宝马   不是对象掉方法么,这个为什么是空的
回复 使用道具 举报
因为m3是一个静态方法,静态方法是属于类的所以不用对象。如果你传入对象也可以,就像静态方法也可以用对象来调用一样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马