美文网首页
JAVA的反射

JAVA的反射

作者: 逝去丶浅秋 | 来源:发表于2020-10-24 19:55 被阅读0次

    一、反射介绍

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。

    JAVA的反射就是将类的各个组成部分封装为其他对象。

    反射是框架设计的灵魂。

    在将 .java 编译成 .class 文件后,类加载将类的class文件读入内存,并为之创建一个java.lang.Class对象,类的加载通常由类加载器完成,类加载器通常由JVM提供。

    所以实际上,我们创建的每一个类本身是java.lang.Class类的实例对象。

    Class类:

    1. Class 类的实例对象表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有很多的实例,每个类都有唯一的Class对象。
    2. Class 类没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机自动构造的。也就是说我们不需要创建,JVM已经帮我们创建了。
    3. Class 对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法

    反射原理:

    java类加载:java类加载就是类加载器根据类的全限定名把.class的二进制字节码代表的静态存储结构转化为方法区的运行时数据结构,然后在内存中生成代表该类的Class对象,一个类有且只有一个Class对象。每次生成Java对象实际上都是通过这个Class对象获取整个类的结构并生成相应的java对象。(接口和抽象类也会被加载为class对象)

    所以如果能够在运行时拿到Class对象,就可以生成java对象并进行调用,这就是java反射的本质。

    二、获取类对象的三种方式

    Class.forName(String className):常用,多用于配置文件,里面的参数需要全路径名

    Object.classObject即对象,例如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)名称。

    相关文章

      网友评论

          本文标题:JAVA的反射

          本文链接:https://www.haomeiwen.com/subject/kkswmktx.html