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 ….])
- 获得所有 public 方法和 继承 方法
- 获得成员变量
- 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类创建实例
//无参数
Class<?> obj = Object.class;
Object obj2 = obj.newInstance();
//有参数
Class<?> c = String.class;
//获取String类带一个String参数的构造器
Constructor constructor = c.getConstructor(String.class);
//根据构造器创建实例
Object obj = constructor.newInstance("23333");
利用反射创建数组
Class<?> cls = Class.forName("java.lang.String");
Object array = Array.newInstance(cls,25);
//往数组里添加内容
Array.set(array,0,"hello");
Array.set(array,1,"Java");
Array.set(array,2,"fuck");
Array.set(array,3,"Scala");
Array.set(array,4,"Clojure");
//获取某一项的内容
System.out.println(Array.get(array,3));
反射的缺点
- 造成系统资源的消耗
- 可能会破坏封装性而导致安全问题