栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java反射

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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框架技术中有着大量的应用。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/318179.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号