java反射简单记录

1.   Java 反射API的第一个主要作用是获取程序在运行时刻的内部结构。这对于程序的检查工具和调试器来说,是非常实用的功能。只需要短短的十几行代码,就可以遍历出来一个Java类的内部结构,包括其中的构造方法、声明的域和定义的方法等。这不得不说是一个很强大的能力。只要有了java.lang.Class类 的对象,就可以通过其中的方法来获取到该类中的构造方法、域和方法。对应的方法分别是getConstructor、getField和getMethod。这三个方法还有相应的getDeclaredXXX版本,区别在于getDeclaredXXX版本的方法只会获取该类自身所声明的元素,而不会考虑继承下来的。Constructor、Field和Method这三个类分别表示类中的构造方法、域和方法。这些类中的方法可以获取到所对应结构的元数据。

2.待测试类

Java代码
  1. package com.home.action.test.mode.reflection;
  2. import java.util.Map;
  3. public class Counter {
  4.     public int count ;
  5.     public Map<String, Object> map;
  6.     public Counter(int count) {
  7.         this.count = count;
  8.     }
  9.     public void increase(int step) {
  10.         count = count + step;
  11.         System.out.println(“count: “+count);
  12.     }
  13. }
[java] view plaincopyprint?

  1. package com.home.action.test.mode.reflection;
  2. import java.util.Map;
  3. public class Counter {
  4.     public int count ;
  5.     public Map<String, Object> map;
  6.     public Counter(int count) {
  7.         this.count = count;
  8.     }
  9.     public void increase(int step) {
  10.         count = count + step;
  11.         System.out.println(“count: “+count);
  12.     }
  13. }

3.测试方法

Java代码
  1. package com.home.action.test.mode.reflection;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.ParameterizedType;
  7. import java.lang.reflect.Type;
  8. /**
  9.  * 测试基本类的反射
  10.  * @author li
  11.  */
  12. public class Test {
  13.     @SuppressWarnings(“rawtypes”)
  14.     public static void main(String[] args) {
  15.         try {
  16.             //构造函数
  17.             Constructor<Counter> contructor = Counter.class.getConstructor(int.class);
  18.             System.out.println(“contructorName: “+contructor.getName());
  19.             Counter counter = contructor.newInstance(10);
  20.             counter.increase(10);
  21.             //基本方法
  22.             Method[] methods = Counter.class.getMethods();
  23.             for(Method method: methods) {
  24.                 System.out.println(“method: “+method.getName());
  25.             }
  26.             Method method = Counter.class.getMethod(“increase”, int.class);
  27.             method.invoke(counter, 6);
  28.             //属性值
  29.             Field[] fields = Counter.class.getFields();
  30.             for(Field field: fields) {
  31.                 System.out.println(“fieldName: “+field.getName());
  32.             }
  33.             //count类型要设置public 否则获取不到, 提示异常信息
  34.             Field field = Counter.class.getField(“count”);
  35.             System.out.println(“countField: “+field.getName());
  36.             //处理泛型
  37.             Field mapField = Counter.class.getDeclaredField(“map”);
  38.             Type type = mapField.getGenericType();
  39.             System.out.println(“mapType: “+ type.toString());
  40.             if(type instanceof ParameterizedType) {
  41.                 ParameterizedType paramerizedType = (ParameterizedType)type;
  42.                 Type[] actualTypes = paramerizedType.getActualTypeArguments();
  43.                 for(Type t: actualTypes) {
  44.                     if(t instanceof Class){
  45.                         Class clz = (Class)t;
  46.                         System.out.println(“classType: “+ clz.getName());
  47.                     }
  48.                 }
  49.             }
  50.         } catch (SecurityException e) {
  51.             e.printStackTrace();
  52.         } catch (NoSuchMethodException e) {
  53.             e.printStackTrace();
  54.         } catch (IllegalArgumentException e) {
  55.             e.printStackTrace();
  56.         } catch (InstantiationException e) {
  57.             e.printStackTrace();
  58.         } catch (IllegalAccessException e) {
  59.             e.printStackTrace();
  60.         } catch (InvocationTargetException e) {
  61.             e.printStackTrace();
  62.         } catch (NoSuchFieldException e) {
  63.             e.printStackTrace();
  64.         }
  65.     }
  66. }

标签