Java反射机制

来源:互联网 发布:手机系统克隆软件 编辑:程序博客网 时间:2024/06/06 04:30

一:反射机制概念:

         运行状态下,对于任意一个类,都能知道它的属性(包括private)及方法.对于任意一个类的实例化对象,都能调用它的属性和方法,这种动态获取信息的方式称之为java反射.

1.反射机制获取类,三种途径:(参考)

  1. /** 
  2.  * 反射机制获取类有三种方法 
  3.  */  
  4. @Test  
  5. public void testGetClass() throws ClassNotFoundException {  
  6.     Class clazz = null;  
  7.   
  8.     //1 直接通过类名.Class的方式得到  
  9.     clazz = Person.class;  
  10.     System.out.println("通过类名: " + clazz);  
  11.   
  12.     //2 通过对象的getClass()方法获取,这个使用的少(一般是传的是Object,不知道是什么类型的时候才用)  
  13.     Object obj = new Person();  
  14.     clazz = obj.getClass();  
  15.     System.out.println("通过getClass(): " + clazz);  
  16.   
  17.     //3 通过全类名获取,用的比较多,但可能抛出ClassNotFoundException异常  
  18.     clazz = Class.forName("com.java.reflection.Person");  
  19.     System.out.println("通过全类名获取: " + clazz);  
  20. }  

2.获取类中方法:method():

 Class clazz = Class.forName("com.java.reflection.Person");//类路径要写全

 Method method = clazz.getDeclaredMethod("methodName",String.class);//第一个参数是方法名,后面的是方法里的参数 

    1. //使用Class类的newInstance()方法创建类的一个对象  
    2. //实际调用的类的那个 无参数的构造器(这就是为什么写的类的时候,要写一个无参数的构造器,就是给反射用的)  
    3. //一般的,一个类若声明了带参数的构造器,也要声明一个无参数的构造器 
  1.     Object obj = clazz.newInstance();  
  2.     method2.invoke(obj, "changwen", 22);  

注 invoke()用法:

  1. /** 
  2.   * @param className  某个类的全类名 
  3.   * @param methodName 类的一个方法的方法名,该方法也可能是私有方法 
  4.   * @param args  调用该方法需要传入的参数 ...可变参数的意思 
  5.   * @return 调用方法后的返回值 
  6.   */  
  7.  public Object invoke(String className, String methodName, Object ... args) {  
  8.      Object obj = null;  
  9.      try {  
  10.          obj = Class.forName(className).newInstance();  
  11.          return invoke(obj, methodName, args);  
  12.   
  13.      } catch (InstantiationException e) {  
  14.          e.printStackTrace();  
  15.      } catch (IllegalAccessException e) {  
  16.          e.printStackTrace();  
  17.      } catch (ClassNotFoundException e) {  
  18.          e.printStackTrace();  
  19.      }  
  20.      return invoke(null, methodName, args);  
  21.  }  
  22.  /** 
  23.   * @param obj  方法执行的那个对象 
  24.   * @param methodName 类的一个方法的方法名,该方法也可能是私有方法,还可能是该方法在父类中定义的私有方法 
  25.   * @param args  调用该方法需要传入的参数 ...可变参数的意思 
  26.   * @return 调用方法后的返回值 
  27.   */  
  28.  public Object invoke(Object obj, String methodName, Object ... args) {  
  29.      //1、获取Method对象  
  30.      Class [] parameterTypes = new Class[args.length];  
  31.      for (int i=0 ; i<args.length; i++){  
  32.          parameterTypes[i] = args[i].getClass();  
  33.      }  
  34.   
  35.      try {  
  36.          //2、执行Method方法  
  37.          Method method = getMethod(obj.getClass(), methodName,parameterTypes);  
  38.   
  39.          //通过反射执行private方法  
  40.          method.setAccessible(true);  
  41.   
  42.          //3、返回方法的返回值  
  43.          return method.invoke(obj,args);  
  44.   
  45.      } catch (Exception e) {  
  46.   
  47.      }  
  48.   
  49.      return null;  
  50.  }  
  51.   
  52.  /** 
  53.   * 获取clazz 的methodName 方法, 该方法可能是私有方法,还可能是父类中的私有方法 
  54.   */  
  55.  public Method getMethod(Class clazz, String methodName, Class ... parameterTypes) {  
  56.      //注意这个循环里的内容!!!  
  57.      for (; clazz != Object.class; clazz = clazz.getSuperclass()){  
  58.          try {  
  59.              return clazz.getDeclaredMethod(methodName, parameterTypes);  
  60.          } catch (Exception e) { //这里要写Exception,不然会出错,应该是有部分异常没有捕获  
  61.   
  62.          }  
  63.      }  
  64.      return null;  
  65.  }  



   

原创粉丝点击