JAVA基础-反射 复习笔记
一、什么是反射
- 在程序正在运行的状态下,动态地获取对象和类的信息和动态地调用他们的方法的机制,称之为反射。
- 例如我们正在写程序的时候,我们一旦写下了要调用某个类的某个方法,源代码编译运行以后,他就按照我们写的代码严格执行。而反射就是java给我们提供的一种在程序运行中依然可以动态获取类信息和运行其方法的机制。
二、反射有什么用
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时获取任意一个类的信息:所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
- 动态代理。
- 通俗的讲:反射可以把java类中的各种成分映射成一个个的Java对象。
三、反射是如何实现的
1、对象创建的简要底层原理
public class demo {
public static void main(String[] args) {
A a1 = new A();
}
}
- 2,编译以后。demo.class字节码文件。
- 3,jvm会加载demo.class字节码文件,然后创建它的Class类实例对象(如果是静态方法可以直接调用),然后执行方法。
- 4,运行到 A a1 = new A(); 时,jvm会去本地磁盘(也就是外存)找A.class文件,将它加载到内存,创建一个A的Class类实例对象。
- 5,通过A的Class对象获得构造方法,再调用构造方法,得到A的实例对象a1。
2、Class类
-
Class类是java类的抽象,就像自定义Student类是学生的抽象、Teacher类是老师的抽象一样。
-
一个java类的Class类对象中包含了这个java类的属性,方法等信息。
-
一个java类只会有一个Class类对象。这个对象是jvm创建了,我们无论获取多少次,都是同一个对象。
四、Class类
1、获取某个java类的Class对象。
@Test
public void t1() throws ClassNotFoundException {
Student s1 = new Student();
Class s1Class = s1.getClass();
Class studentClass1 = Student.class;
Class studentClass2 = Class.forName("com.example.demo.entity.Student");
}
2、创建类的实例对象
方法 | 说明 |
---|
public T newInstance(); | 创建对象 |
3、获取类的属性对象
方法 | 说明 |
---|
public Field[] getFields() | 返回类中public修饰的属性对象 |
public Field[] getDeclaredFields() | 返回类中所有的属性对象 |
public Field getDeclaredField(String name) | 根据属性名name获取指定的属性对象 |
public Field[] getFields(String name) | 根据属性名name获取指定的public修饰的属性对象 |
4、获取类的方法对象
方法 | 说明 |
---|
public Method[] getMethods() | 获取所有的public修饰的方法对象 |
public Method[] getDeclaredMethods() | 获取所有的方法对象 |
public Method getMethod(String methodName,Class<?>… parameterTypes) | 根据方法名、参数类型获取public修饰的方法对象 |
public Method getDeclaredMethod(String methodName,Class<?>… parameterTypes) | 根据方法名、参数类型获取方法对象 |
5、获取类的构造方法对象
方法 | 说明 |
---|
public Constructor getConstructor(Class<?>… parameterTypes) | 根据参数类型获取public修饰的构造器对象 |
public Constructor[] getConstructors() | 获取所有public修饰的构造器对象 |
public Constructor getDeclaredConstructor(Class<?>… parameterTypes) | 根据参数类型获取构造器对象 |
public Constructor<?>[] getDeclaredConstructors() | 获取所有构造器对象 |
五、Field类
属性类
方法 | 说明 |
---|
public String getName() | 返回属性名 |
public int getModifiers() | 获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】 |
public Class<?> getType() | 以Class类型,返回属性类型【一般配合Class类的getSimpleName()方法使用】 |
public void set(Object obj, Object value) | 设置属性值 |
public Object get(Object obj) | 读取属性值 |
六、Method类
方法类
方法 | 说明 |
---|
public String getName() | 返回方法名 |
public int getModifiers() | 获取方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】 |
public Class<?> getReturnType() | 以Class类型,返回方法类型【一般配合Class类的getSimpleName()方法使用】 |
public Class<?>[] getParameterTypes() | 返回方法的参数类型列表(一个方法的参数可能会有多个。)【结果集一般配合Class类的getSimpleName()方法使用】 |
public Object invoke(Object obj, Object… args) | 调用方法(常用) |
七、Constructor类
构造器类
方法 | 说明 |
---|
public String getName() | |
public int getModifiers() | 获取方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号 |
public Class<?>[] getParameterTypes() | |
public T newInstance(Object … initargs) | 创建对象 |