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));
反射的缺点
- 造成系统资源的消耗
- 可能会破坏封装性而导致安全问题

