简单来说,Java中通过反射,可以在运行时获得程序自身的信息,并且可以操作类或对象的内部属性。
Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.
The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.
上述为Oracle官方的反射解释。
Java反射提供的功能:
- 1.在运行时判断任意一个对象所属的类;
- 2.在运行时构造任意一个类的对象;
- 3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
- 4.在运行时调用任意一个对象的方法
class类
提到反射,我们需要先声明下Java中的class类,as we know,所有的java类均继承了Object类,在Object类中定义了一个getClass()方法,该方法返回一个类型为Class的对象。如下
通过testc对象我们可以访问到JTextFiel的描述信息:主要描述信息如下
访问方法 | 返回值类型 | 说明 |
---|---|---|
getPackage() | Package对象 | 获得该类的存放路径 |
getName() | String对象 | 该类的名称 |
getSuperClass() | Class对象 | 获得该类继承的类 |
getInterface() | Class数组 | 获得该类实现的所有接口 |
getConstructors() | Constructor数组 | 获得所有权限为public的构造方法 |
getConstructor(Class<?>…types) | Constructor对象 | 获得权限为public的指定的构造方法 |
getDeclaredConstructors() | Constructor数组 | 获得所有的构造方法,按声明顺序返回 |
getDeclaredConstructor(Class<?>…types) | Constructor对象 | 获得指定的构造方法 |
getMethods() | Method数组 | 获得所有权限为Public的方法 |
getMethod(String name, Class<?>…types) | Method对象 | 获得权限为Public的指定的方法 |
getDeclaredMethods() | Method数组 | 获得所有的方法,按声明顺序返回 |
getDeclaredMethod(String name, Class<?>…types) | Method对象 | 获得指定的方法 |
getFields() | Field数组 | 获得所有权限为Public的成员变量 |
getField(String name) | Field对象 | 获得权限为Public的指定的成员变量 |
getDeclaredFields() | Field数组 | 获得所有的成员变量 |
getDeclaredField(String name) | Method对象 | 获得指定的成员变量 |
getClasses() | Class数组 | 获得所有权限为public的内部类 |
getDeclaredClasses() | Class数组 | 获得所有内部类 |
getDeclaringClass() | Class对象 | 如果该类为内部类,则返回它的成员类,否则返回null |
说明:getClasses()和getMethods()会包含父类中权限为public的成员变量和方法
获得Class的其他方法
java提供的反射类
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
获得Class对象
|
|
打印结果为
获得对象的父类和实现的接口
|
|
打印结果为
获得类中的构造函数
|
|
打印结果为
###实例化一个对象
|
|
打印结果为
获取类的全部属性
|
|
打印结果为
获取类的方法
|
|
打印结果为
反射调用类的方法
|
|
打印结果
反射操作类的属性
|
|
打印结果
反射的动态代理
|
|
打印结果为
反射的应用
在泛型为Integer的ArrayList中存放一个String类型的对象。
|
|
打印结果为
反射修改数组信息和大小
|
|
打印结果为
将反射机制应用于改善简单工厂模式的缺陷
|
|
打印结果为
参考
Java
Java初级码农博客