1.Reflection(反射)
是Java被视为动态语言的关键,Java 运行时系统始终为所有的对象维护一个被称为运行时的类型标识,做Class的类(一个类只有一个Class对象)。 这个信息跟踪着每个对象的所有信息。反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
2,反射和正常运行不同
3 反射的功能
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时获取泛型信息 在运行时调用任意一个对象的成员变量和方法
在运行时处理注解 生成动态代理
4 一些重要方法
获得相应的Class信息三种方式:
获得class办法一:通过对象获得 : Class clazz1 = person.getClass();
获得class办法二:通过字符串获得(包名+类名) : Class clazz2 = Class.forName("com.reflection.Student");
获得class办法三:通过类的静态成员class获得 :Class clazz3 = Person.class;
(外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类。 接口 数组 枚举,基本数据类型都有其class对象)
对象实例化:
Object o1 = o.newInstance();
获得域:Class cl = Class.forName(name)为例)
Field[] fields = cl. getFields() 这个类或其超类的公有域
Field[] fields = cl.getDeclaredFieds() 了这个 类的全部域,如果类中没有域, 或者 Class 对象描述的是基本类型或数组类型, 这些 方法将返回一个长度为 0 的数组。
获得方法:(Class cl = Class.forName(name)为例)
Method[] methods = cl.getMethods() 将返回所有的公有方法, 包括从超类继承来的公有方法
Method[] methods = cl.getDeclaredMethods();返回这个类或接口的全部方法,但不包括由超类继承了的方法
Method method= cl.getMethod("某个方法名","每有一个参数就写一个参数类型") 可以得到特定的方法名
获得构造器:(Class cl = Class.forName(name)为例)
Constructor[] constructors = cl.getConstructors()
Constructor[] constructors = cl.getDeclaredConstructors();
返回包含 Constructor 对象的数组, 其中包含了 Class 对象所描述的类的所有公有构造器(getConstructors) 或所有构造器(getDeclaredConstructors)
5. setAccessible Method和Field、Constructor对象都有setAccessible()方法。
setAccessible作用是启动和禁用访问安全检查的开关。 参数值为true则指示反射的对象在使用时应该取消Java语言访问检查。 提高反射的效率。如果代码中必须用反射,而该句代码需要频繁的被调用,那么请设置为true。 使得原本无法访问的私有成员也可以访问 参数值为false则指示反射的对象应该实施Java语言访问检查