Java反射

反射

内容导航

反射机制是Java语言的一项特性。反射机制是构建框架技术的所在,是很多流行框架的实现基础。

Java反射概述

反射机制是Java语言特性之一,是Java被视为动态(或准动态)语言的一个关键特性。

什么是反射

在计算机领域,反射指一种能力,能够自描述和自控制,即在运行转台中,动态获取类信息及动态调用实例方法的能力。

Java反射有以下3个特性。

  • 运行时创建实例。
  • 运行期间调用方法。
  • 运行时更改属性。

通过Java反射可以实现一下功能。

  • 在运行时探知任意一个实力所属的类
  • 在运行时构造任意一个类的实例。
  • 在运行时探知任意一个类具有的方法和属性。
  • 在运行时调用任意一个实例的方法。

获取类的信息

一个类或接口被加载后,从系统中都能获得一个代表该类的Class类型的实例,通过该实例就可以访问到Java虚拟机中的这个类或接口。

1.获取Class实例

Java程序中或得Class实例通常有如下3种方式,可根据实际情况灵活选择。

  • 调用类或接口的getClass()方法。

    Class clz=obj.getCLass();//obj为某个类型的实例
    
  • 调用类或接口的class属性。

    在某些类或接口没有实例或无法创建实例的情况下,可以通过class属性获取所对应的Class实例,这种方式需要在编译期就知道类或接口的名称。

    Class clz=Student.class;//Student为自定义的学生类
    
  • 使用Class.forName()方法。

    若编译期间无法确认具体类型,需要程序在运行时根据情况灵活加载,可以使用Class类的forName()方法。该方法是静态方法,需要传入字符串参数,该字符串参数的值是某个类的完全限定类名,既包含报名的完整类名。

    Class clz=Class.forName("com.mysql.cj.jdbc.Driver");
    

2.从Class实例获取信息

在获得某个类型的对应的Class实例之后,就可以调用Class实例的方法来获得该类型的信息。Class类提供了大量实例方法来获取对应类型的详细信息。

获取对应类型的基本信息,相关方法如表1-1所示。

表1-1 获取对应类型基本信息的方法

方法 说明
String getName() 以字符串形式返回该类型的名称
String getSimpleName() 以字符串形式返回该类型的简称
Package getPackage() 获取该类型所在的包
Class getSuperclass() 返回该类型的超类的Class实例
Class[] getInterfaces() 返回该类型所在实现的全部接口的实例
int getModifiers() 返回该类型的所有修饰符,由public、protected、private、final、static、abstract、等对应的int常量组成,返回的整数应用使用Modifier工具类来解码,才可以判断修饰符的构成
Class[] getDeclaredClasses() 返回该类型中包含的全部内部类的Class实例
Class getDeclaringClass() 返回该类型所在的外部类的Class实例

获取对应类型所包含的构造方法,常用方法如表1-2所示。

表1-2 获取对应类型所含构造的方法

方法 说明
Constructor getConstructor(Class... params) 返回该类型指定参数列表的public构造方法。例如:Constructor co=clz.getConstructor(String.class,List.class);
Constructor[] getConstructors() 返回该类型的所有public构造方法
Constructor getDeclaredConstructor(Class... params) 返回该类型的制定参数列表的构造方法,访问级别不限
Constructor[] getDeclaredConstructors() 返回该类型的所有构造方法,访问级别不限

获取对应类型所包含的属性,常用方法如表1-3所示。

表 1-3 获取对应类型所含属性的方法

方法 说明
Field getField(String name) 返回该类型中指定名称的public属性,name参数用于指定属性名称,例如:clz.getFIeld("age");//clz为某Class对象,age为属性名
Field[] getFileds() 返回该类型中所有public属性
Field getDeclaredField(String name) 返回该类型中指定名称的属性,与属性的访问级别无关
Field[] getDeclaredFields() 返回该类型中的全部属性,与属性的访问级别无关

访问对应类型所包含的方法,常用方法如表1-4所示。

表 1-4 访问类包含方法的方法

方法 说明
Method getMethod(String name,Class... params) 返回该类型中指定的public方法,name参数用于指定方法名称,params参数指定列表。
Method[] getMethods() 返回该实例中所有public方法
Method getDeclaredMethod(String name,Class... params) 返回该实例指定的方法,与方法的访问级别无关
Method[] getDeclaredMethods() 返回该实例中的全部方法,与方法的访问级别无关

创建实例

通过反射来创建Java类型的实例有如下两种方式。

  • 使用Class实例的newInstance()方法创建相关的实例。

    Object obj=clz.newInstance();//clz为Class实例
    
  • 使用Constructor实例创建相关类型的实例。

    //下面那个相当于调用了带一个参数的构造函数
    Object obj=clz.getDeclaredConstructor().newInstance();//clz为Class实例
    Object obj=clz.getDeclaredConstructor(String.class).newInstance("属性值");
    

总结

  • Java反射机制是指在运行状态中,动态获取类型信息及动态访问实例成员的能力。
  • 使用反射可以在程序运行时创建类的实例及访问其属性和方法。
  • 反射在Java框架技术中有着大量的应用。
posted @ 2021-10-12 15:51  熵熵熵  阅读(73)  评论(0)    收藏  举报