一、反射介绍
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。
JAVA的反射就是将类的各个组成部分封装为其他对象。
反射是框架设计的灵魂。
在将
.java
编译成
.class
文件后,类加载将类的
class
文件读入内存,并为之创建一个
java.lang.Class
对象,类的加载通常由类加载器完成,类加载器通常由
JVM
提供。
所以实际上,我们创建的每一个类本身是
java.lang.Class
类的实例对象。
Class类:
Class 类的实例对象表示正在运行的 Java 应用程序中的类和接口
。也就是
jvm
中有很多的实例,每个类都有唯一的
Class
对象。Class 类没有公共构造方法。
Class 对象是在加载类时由 Java 虚拟机自动构造
的。也就是说我们不需要创建,
JVM
已经帮我们创建了。Class 对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法
反射原理:
java类加载:java类加载就是类加载器根据类的全限定名把.class的二进制字节码代表的静态存储结构转化为方法区的运行时数据结构,然后在内存中生成代表该类的Class对象,一个类有且只有一个Class对象。每次生成Java对象实际上都是通过这个Class对象获取整个类的结构并生成相应的java对象。(接口和抽象类也会被加载为class对象)
所以如果能够在运行时拿到Class对象,就可以生成java对象并进行调用,这就是java反射的本质。
二、获取类对象的三种方式
Class.forName(String className)
:常用,多用于配置文件,里面的参数需要全路径名
Object.class
:
Object
即对象,例如
Person.class
new Object().getClass()
:创建对象调用
getClass()
方法
在一个
JVM
中,同一个字节码文件在一次程序运行过程中,只会被加载一次,也就是说只会有一个类对象存在。
所以上面三种方式获取的类对象,都是一样的。
三、Class对象API
1、获取成员变量
Field getField(String name)
:返回
Class
对象表示的类或接口的一个指定
公共成员
字段。
Field类常用的方法
:
-
设置值
-
void set(Object obj, Object value)
-
-
获取值
-
Object get(Object obj)
-
-
忽略访问权限修饰符的安全检查(构造器和方法的获得都有此方法)
-
void setAccessible(boolean flag)
-
Field[] getFields()
:返回
Class
对象所表示的类或接口的
所有可访问公共
字段。
Field getDeclaredField(String name)
:返回
Class
对象表示的类或接口的一个指定字段。包括
公共、保护、默认和私有字段
,但不包括继承的字段。
Field[] getDeclaredFields()
:返回
Class
对象所表示的类或接口所声明的所有字段。包括
公共、保护、默认和私有字段
,但不包括继承的字段。
2、获取构造方法
Constructor<T> getConstructor(Class<?>… parameterTypes)
:返回
Class
对象所表示的类的
指定参数公共
构造方法。
Constructor<?>[] getConstructors()
:返回
Class
对象所表示的类的
所有公共
构造方法
Constructor<T> getDeclaredConstructor(Class<?>… parameterTypes)
:返回
Class
对象所表示的类的
指定参数
构造方法。包括
公共、保护、默认和私有构造方法
。
Constructor<?>[] getDeclaredConstructors()
:返回Class 对象所表示的类的
所有
构造方法。包括
公共、保护、默认和私有构造方法
。
Constructor类常用方法
:
-
T newInstance(Object… initargs):使用此
Constructor
对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
如果使用空参数的构造方法创建对象,操作可以简化,使用Class里面提供的方法:
T newInstance();
3、获取成员方法
Method getMethod(String name, Class<?>… parameterTypes)
:返回
Class
对象所表示的类或接口的
指定公共
成员方法。
Method[] getMethods()
:返回
Class
对象所表示的类或接口的
所有公共
成员方法。(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共
member
方法。
Method getDeclaredMethod(String name, Class<?>… parameterTypes)
:返回
Class
对象所表示的类或接口的
指定已声明
方法。
Method[] getDeclaredMethods()
:返回
Class
对象表示的类或接口声明的
所有
方法,包括公共、保护、默认和私有方法,但不包括继承的方法。
Method类常用方法
:
-
invoke(Object obj, Object… args):执行方法
-
String getName():获取方法名
4、获取类名
String getName()
:以
String
的形式返回此
Class
对象所表示的实体(类、接口、数组类、基本类型或 void)名称。