Java 的反射机制 : 程序在运行时动态获得类的信息(所有属性,方法)调用类的方法

获得Class类的三种方法

  • 通过类名
    • Class.forName(String name)
  • 通过类的实例
    • obj.getClass();
  • 直接获得Class
    • Object.class

Class类的常用方法

  • 判断是否为某个类的实例
    • obj.isInstance(Object obj)
  • 获得类的方法
    • 获得所有 public 方法和 继承 方法
      • class.getMethods()
    • 获得本类所有方法 不包括继承
      • class.getDeclaredMethods()
    • 通过方法名和参数列表 获得某一个方法
      • class0.getMethod(String MethodName[, Class Param ….])
  • 获得成员变量
    • class0.getField(String Name)
    • class0.getFields()
    • class0.getDeclaredFields(String Name)
    • class0.getDeclaredFields()
  • 获得注解
    • 类的所有注解
      • class.getAnnotations()
    • 类的直接注解
      • class.getDeclaredAnnotations()
  • 获得构造器
    • class0.getConstructors([, Class Param ….])
  • 调用方法 Method类
    • method.invoke(Object invokeObjName[, Class Param])
    • invokeObjName 调用这个方法的对象

Class类创建实例

  1. //无参数
  2. Class<?> obj = Object.class;
  3. Object obj2 = obj.newInstance();
  4. //有参数
  5. Class<?> c = String.class;
  6. //获取String类带一个String参数的构造器
  7. Constructor constructor = c.getConstructor(String.class);
  8. //根据构造器创建实例
  9. Object obj = constructor.newInstance("23333");

利用反射创建数组

  1. Class<?> cls = Class.forName("java.lang.String");
  2. Object array = Array.newInstance(cls,25);
  3. //往数组里添加内容
  4. Array.set(array,0,"hello");
  5. Array.set(array,1,"Java");
  6. Array.set(array,2,"fuck");
  7. Array.set(array,3,"Scala");
  8. Array.set(array,4,"Clojure");
  9. //获取某一项的内容
  10. System.out.println(Array.get(array,3));

反射的缺点

  1. 造成系统资源的消耗
  2. 可能会破坏封装性而导致安全问题

Java反射 - 图1