JAVA的反射

  • Post author:
  • Post category:java


一、反射介绍

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.class




Object

即对象,例如

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)名称。



版权声明:本文为qq_36144703原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。