JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.
反射就是把java类中的各种成分映射成一个个的Java对象
反射(Reflection)机制是Java语言特性之一,是Java被视为动态(或准动态)语言的一个关键特性.
在计算机领域反射指一种能力,能够自描述和自控制,即在运行状态中,动态获取类信息及动态调用实例方法的能力.
Java反射机制能够探知类的基本结构,这种对Java类结构探知的能力,称为Java类的"自审".并且反射机制是构建框架技术的基础所在.
Java反射有以下3个动态特性.
运行时创建实例
运行期间调用方法
运行时更改属性
Java程序执行过程 Person.java---编译器---Person.class---Java虚拟机---运行程序
Java反射常用API:
反射技术常用的类如下:
Java.lang.Class<T>类:反射的核心类,反射所有的操作都是围绕该类来生成的.通过Class类可以获取类的属性,方法等内容信息.
Java.lang.reflect.Constructor<T>类:表示类的构造方法.
Java.lang.reflect.Field类:表示类的属性,可以获取和设置类中属性的值.
Java.lang.reflect.Method类:表示类的方法,可以用来获取类中方法的信息或执行方法.
获取对应类型基本信息的方法
方法 | 说明 |
String getName() | 以字符串形式返回该类型的名称 |
String getSimpleName() | 以字符串形式返回该类型的简称 |
Package getPackage() | 获取该类型所在的包 |
Class getSuperclass() | 返回该类型的超类的Class实例 |
Class[] getInterfaces() | 返回该类型所实现的全部接口的Class实例 |
int getModifiers() | 返回该类型的所有修饰符,由public,protected,private,final,staic,absstract等对应的int常量组成,返回的整数应使用Modifier工具类来解码,才可以判断修饰符的构成 |
Class[] getDeclaredClasses() | 返回该类型中包含的全部内部类的Class实例 |
Class[] getDeclaringClass() | 返回该类型所在的外部类的Class实例 |
获取对应类型所含构造方法的方法
方法 | 说明 |
Constructor getConstructor(Class…params) | 返回该类型指定参数列表的public构造方法,构造方法的参数列表与params所指定的类型列表所匹配.例如: Constructor co = clz.getConstructor(String.class,List.class); 其中,clz为某Class实例. |
Constructor[] getConstructors() | 返回该类型的所有public构造方法 |
Constructor getDeclaredConstructor(Class…params) | 返回该类型指定的参数列表的构造方法,访问级别不限 |
Constructor[] getDeclaredConstructors() | 返回该类型的所有构造方法,访问级别不限 |
获取对应类型所含属性的方法
方法 | 说明 |
Field getField(String name) | 返回该类型中指定名称的public属性,name参数用于指定属性名称.例如:clz.getField("age"); //clz为某Class对象,age为属性名 |
Field[] getFields() | 返回该类型中所有public属性 |
Fleld getDeclaredField(String name) | 返回该类型中指定名称的属性,与属性的访问级别无关 |
Field[] getDeclaredFields() | 返回该类型中的全部属性,与属性的访问级别无关 |
访问类包含方法的方法
方法 | 说明 |
Method getMethod(String name,Class…params) | 返回该实例中指定的public方法,name参数用于指定方法名称,params参数指定参数列表.例如: Clz.getMethod("info",String.class); //clz为某Class实例. |
Method[] getMethods() | 返回该实例中所有public方法 |
Method getDeclaredMethod(String name,Class…params) | 返回该实例中指定的方法,与方法的访问级别无关 |
Method[] getDeclaredMethod() | 返回该实例中的全部方法,与方法的访问级别无关 |
访问了的属性的方法
这里的调用者就是对象的属性
返回值 方法名 描述
get(Object obj)和set(Object obj ,Object val)
这里set就是设置,get就是获取
obj表示的是将属性设置到那个实例(对象)中,val表示的就是值
xxx getXXX(Object obj) | xxx表示8中基本数据类型之一 obj表示该属性所在类的实例(对象) |
Object get(Object obj) | 以Object类型返回obj中相关属性的值 |
void setXxx(Object obj,xxx val) | 将Obj中相关属性的值设置为val,Xxx为8中基本数据类型之一 |
void set(Object obj,Object val) | 将Obj中相关属性的值设置为val |
void setAccessible(boolean flag) | 对相关属性设置访问权限,设置为true可以禁止java语言访问检查(就是可以访问) |