JAVA反射基础

143 阅读1分钟

目标

  • 认识类加载流程
  • 认识反射
  • 如何通过反射创建对象

知识点

类加载机制:

  • 因为类加载流程是:

1621998337(1).jpg

graph TD
java源文件 --> Class文件(通过编译称为Class文件) --> 类加载器ClassLoader(将类加载到JVM中) --> 加载 -->  验证
--> 准备 --> 解析 --> 初始化 --> 进入到JVM运行内存区域中
  • Class文件中包含的内容 1621998294.jpg

一般情况下创建对象是通过正向创建,也就是提前知道创建那个类,之后对其进行实例化。

    Apple apple = new Apple();

反射就是开始时并不知道需要创建的是什么对象,所以无法通过new进行创建,必须通过JDK提供的方法进行所谓的反射创建对象

反射概念:

反射就是在程序编译时,程序猿并不知道用户所要创建的对象是什么?只有当用户调用时候(程序运行中)才能确定所传入的类是什么,通过获取类的信息进行创建对象,并调用。

常用的通过反射获取Class对象的方式:

  • 使用Class.forName()
    Class clazz = Class.forName("类全路径");
  • 使用.class方式(需要提前知道所传入的类是什么)
    Class clazz = Person.class;
  • 使用类对象的getClass()方法
    Person person = new Person();
    Class clazz = person.getClass();

通过反射创建对象

  • 通过Class对象newInstance()方法
    Person person = (Person) clazz.newInstance();
  • 通过Constructor对象的newInstance()方法
    Constructor<?> constructor = clazz.getConstructor();
    //这里调用无参构造方法
    Person person =(Person) constructor.newInstance();

通过反射获取类的属性,方法,构造器等

        Class<Person> personClass = Person.class;
        //这里通常属性是私有属性,如果使用getFields()只能获取共有属性public
        Field[] fields = personClass.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName());
            System.out.println(field.getType());
        }
    
    //通过反射构建对象
      Constructor<?> constructor = aClass.getConstructor(Integer.class, String.class);
        Person person = (Person) constructor.newInstance(1, "名称");
        System.out.println(JSONUtil.toJsonStr(person));