什么是反射

1. 什么是Java反射机制?

java反射机制就是java程序在运行的时候 动态创建类并调用类的方法以及属性

2. 反射的原理?

简单来说就是类加载时,jvm通过字节码class文件,生成相应的对象。

我们都知道java类的执行需要编译、加载、连接、初始化四步。

  • 编译:java文件编译后生成 .class 字节码文件。
  • 加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例
  • 连接:细分三步
    • 验证:格式(class文件规范) 语义(final类是否有子类) 操作
    • 准备:静态变量赋初值和内存空间,final修饰的内存空间直接赋原值,此处不是用户指定的初值。
    • 解析:符号引用转化为直接引用,分配地址
  • 初始化:有父类先初始化父类,然后初始化自己;将static修饰代码执行一遍,如果是静态变量,则用用户指定值覆盖原有初值;如果是代码块,则执行一遍操作。

Java的反射就是利用上面第二步加载到jvm中的 .class 文件来进行操作的。 .class 文件中包含java类的所有信息,当你不知道某个类具体信息时,可以使用反射获取class,然后进行各种操作。

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。

总结说:反射就是把java类中的各种成分映射成一个个的Java对象,并且可以进行操作。

3. 反射创建类实例的三种方式

JavaBean

package com.liang.stu.bloglog.article;

public class Demo24_Car {

    public String name;

    public Demo24_Car() {
    }

    public Demo24_Car(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

3.1 对象.getClass()

Demo24_Car d1 = new Demo24_Car("火车");
Class class1 = d1.getClass();

3.2 类.class

需要输入一个明确的类,任意一个类型都有一个静态的class属性

Class class3 = Demo24_Car.class;

3.3 Class.forName(“全路径名称”)

  • 通过Class类的一个 forName(String className) 静态方法返回一个Class对象,className必须是全路径名称
  • 全路径名称只需要以字符串的方式传入即可
  • Class.forName() 有 ClassNotFoundException 异常
Class class4 = Class.forName("com.liang.stu.bloglog.article.Demo24_Car");

Class.forName 和 ClassLoader 区别

  • Java中Class.forName和classloader都可以用来对类进行加载。
  • Class.forName除了将类的 .class文件 加载到jvm中之外,还会对类进行解释,执行类中的static块。
  • 而classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
  • Class.forName(name,initialize,loader)带参数也可控制是否加载static块。

4. 参考链接

  1. Java反射机制的原理以及创建类实例的三种方式是什么?
  2. java反射的原理,作用