黑马程序员技术交流社区

标题: 成员方法和静态方法的反射 [打印本页]

作者: Morgan    时间: 2015-7-5 20:46
标题: 成员方法和静态方法的反射
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. }
复制代码






作者: 绝版坏银    时间: 2015-7-5 20:50
m3.invoke(null);//宝马   不是对象掉方法么,这个为什么是空的
作者: Morgan    时间: 2015-7-5 21:00
因为m3是一个静态方法,静态方法是属于类的所以不用对象。如果你传入对象也可以,就像静态方法也可以用对象来调用一样。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2