概述 能够分析类能力的程序成为反射reflective。反射机制的功能及其强大,再下面可以看到,反射机制可以用来: 在运行时分析类的能力 在运行时查看对象,例如,编写一个toString()方法供所有类使用。 实现通用的数组操作代码。 利用Method对象,这个对象很像C++中的指针函数。 Class类 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。 获取类字节码方式 Class.forName(); 静态方法调用 Class<?> forName = Class.forName("path"); 类型.class Class<?> cls = Person.class; 对象.class Person person = new Person(); Class<?> cls = person.class; 常用方法 // 返回描述类名为className的Class对象 static Class forName(String className); // 返回类的实例对象,调用的是默认无参构造方法 Object newInstance(); Constructor类 /** * 构造一个这个构造器所属类的新实例 * @param args 这个构造方法所需的形式参数 */ Object newIntance(Object[] args); /** * 获取字节码中所有公开的构造方法 */ Constructor[] getConstructors(); /** * 获取所有的构造的方法,包括private修饰的 */ Constructor<?>[] getDeclaredConstructors(); /** * 获取指定形参类型,和数量的公开的构造方法 */ Constructor<T> getConstructor(Class<?>... parameterTypes); /** * 获取指定形参类型,和数量的任何修饰符的构造方法 */ Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes); Method类 /** * 获取所有公开方法 */ Method[] getMethods(); /** * 获取所有方法,包括私有方法 */ Method[] getDeclaredMethods(); /** * 获取公开方法 * @param name 方法的名称 * @param parameterTypes 形式参数 */ Method getMethod(String name, Class<?>... parameterTypes) /** * 获取指定方法,包括私有方法 * @param name 方法的名称 * @param parameterTypes 形式参数 */ Method getDeclaredMethod(String name, Class<?>... parameterTypes) /** * 调用方法 * @param obj 方法被调用对象 * @param args 形式参数列表 */ Object invoke(Object obj, Object... args) Field类 /** * 获取所有公开成员变量 */ Field[] getFields(); /** * 获取所有成员变量 */ Field[] getDeclaredFields() /** * 获取指定名称的公开的成员变量 */ Field getField(String name) /** * 获取指定名称的成员变量 */ Field getDeclaredField(String name) /** * 设置obj指定成员变量值value * @param obj 需要修改的变量 * @param value 修改的值 */ void set(Object obj, Object value) /** * 获取obj对象的指定成员变量值 */ Object get(Object obj) 暴力反射 Field name = forName.getDeclaredField("name"); name.setAccessible(true);