反射基础

反射

1.类加载

类的加载

  • 就是指将class文件读入内存,并为之创建一个java.lang.Class对象
  • 任何类被使用时,系统都会为之建立一个java.lang.Class对象

类的连接

  • 验证阶段:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致
  • 准备阶段:负责为类的类变量分配内存,并设置默认初始值
  • 解析阶段:将类的二进制数据中的符号引用替换为直接引用

类的初始化

  • 在该阶段,主要就是对类变量进行初始化

类的初始化步骤

  • 假如类还未被加载和连接,则程序先加载并连接该类
  • 假如该类的直接父类还未被初始化,则先初始化其直接父类
  • 假如该类有初始化语句,则系统依次执行该初始化语句
    1. 注意:在执行第二步骤的时候,系统对直接父类初始化步骤同上

类的初始化时机

  • 创建类的实例
  • 调用类的类方法
  • 访问类或者接口的类变量,或者为该类变量赋值
  • 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
  • 初始化某个类的子类
  • 直接使用java.exe命令来运行某个主类

2.类加载器

类加载器的作用

  • 负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象
  • 虽然我们不用过分关心类加载机制,但时了解这个机制我们就能更好的理解程序的运行

JVM的类加载机制

  • 全盘负责:就是当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将有该类加载器来负责载入,除非显示使用另外一个类加载器来载入
  • 父类委托:就是当一个类加载器负责加载某个Class时,先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类
  • 缓存机制:保证所有加载过的Class都会被缓存,当程序需要使用某个Class对象时,类加载器先从缓存区中搜索该Class,只有当缓存区中不存在该Class对象时,系统才会读取对应的进制数据,并将其转换成Class对象,存储到缓存区

3.反射概述

1619013714524.png

反射机制:

是指在与运行时去获取一个类的变量和方法信息。然后通过获取到的信息来床创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完全确定,在运行期仍然可以扩展

获取Class对象的三种方法

//通过类的class属性获得
Class c = Student.class;
//通过对象的getClass方法获得
Class c = student.getClass();
//通过Class类的静态方法获得
Class c = Class.forName("包名.类名");

反射获取构造方法并使用

Class类中用于获取构造方法的方法

  • Constructor[] getConstructors():返回所有公共构造方法对象的数组
  • Constructor[] getDeclaredConstructors():返回所有构造方法对象的数组
  • Constructor getConstructor(Class...parameterTypes):返回单个公共构造方法对象
  • Constructor getDeclaredConstructor(Class...parameterTypes):返回单个构造方法对象

反射获取成员变量并使用

Class类中用于获取成员变量的方法

  • Field[] getField(): 返回所有公共成员变量对象的数组
  • Field[] getDeclaredFields():返回所有成员变量对象的数组
  • Field[] getField(String name):返回单个公共成员变量对象
  • Field[] getDeclaredField(String name):返回单个成员变量对象

Filed类中用于给成员变量赋值方法

  • void set(Object obj, Object value):给obj对象的成员变量赋值为value

反射获取成员方法并使用

Class类中用于获取成员方法的方法

  • Method[] getMethod():返回所有公共成员方法对象的数组,包括继承的
  • Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
  • Method getMethod(String name,Class...paramterTypes):返回单个公共成员方法对象
  • Method getDeclaredMethod(String name,Class...paramterTypes):返回单个成员变量对象

Method类中用于调用成员方法的方法

  • Object invoke(Object obj,Object...args):调用obj对象的成员方法,参数是args,返回值是Object类型

4.反射的应用

配置文件运行类方法

import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

//配置文件运行类方法
public class ReflectDemo5 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    //加载数据
    Properties prop = new Properties();
    FileReader fr = new FileReader("C:\\Users\\11525\\Desktop\\array.txt");//读取配置文件
    prop.load(fr);
    fr.close();
    //获取配置文件的有效信息
    String className = prop.getProperty("className");
    String methodName = prop.getProperty("methodName");
    //获取Class对象
    Class c = Class.forName(className);
    //获取类的构造方法
    Constructor con = c.getConstructor();
    //通过反射获得类的对象
    Object obj = con.newInstance();
    //通过反射获取对象的方法
    Method m = c.getMethod(methodName);
    //利用invoke()执行方法
    System.out.println(m.invoke(obj));
    }
}
1619095673452.png

你可能感兴趣的:(反射基础)