Java 反射

本文介绍了Java反射机制,通过Class类可以访问并操作类的构造方法、成员变量和方法。反射允许在运行时动态创建对象和调用方法,包括私有成员。此外,还讲解了如何定义和使用Annotation,以及它们在代码中的作用。
摘要由CSDN通过智能技术生成

Class类与Java反射

通过反射,可以访问程序中已经装载到JVM中的Java对象实例的描述,实现访问、检测和修改描述Java对象本身信息的功能,如类的包名、类名、构造方法、方法、成员变量等

正常顺序是定义一个类,根据这个类new实例(类 --> 对象);
反射则是逆过程,根据实例来获取对应类的构造方法、成员变量等信息,然后用获取到的构造方法去创建类的实例、操作对象的成员变量值、调用对象的方法等(对象 --> 类 --> 对象

访问构造方法

下列方法会返回Constructor类型的对象或数组,每个Constructor代表一个类的构造方法,利用Constructor对象可以生成对应的类的对象实例

获取构造方法

获取权限为publicgetConstructor(Class<?>...parameterTypes)    获取指定构造方法
getConstructors()    获取全部构造方法
获取所有的(任意权限)
getDeclaredConstructor(Class<?>...parameterTypes)    获取指定构造方法
getDeclaredConstructors()    获取全部构造方法

若要获取指定构造方法,需要根据该方法的参数类型访问,如一个参数依次为Stringint
对象实例.getDeclaredConstructor(String.class, int.class)
或
对象实例.getDeclaredConstructor(new Class[] {String.class, int.class})  

Constructor类中提供了一些常用方法

getParameterTypes()Class数组的形式获得构造方法的各个参数类型,按照声明顺序
getExceptionTypes()Class数组的形式获取该构造方法可能抛出的异常类型
newInstance(Object...initargs)    通过该构造方法指定参数创建一个该类的对象实例,未指定则采用默认无参构造方法
setAccessible(boolean flag)    若该构造方法权限为private,要执行该方法将入口参数设为true
                              获取private构造方法时,注意要用getDeclaredConstructor
getModifiers()    获得可以解析出构造方法所采用修饰符的整数
               通过java.lang.reflect.Modifier类可以解析出getModifiers方法返回值中所表示的修饰符信息
               int modifiers = constructor.getModifiers();
               boolean isEmbellishByPrivate = Modifier.isPrivate(modifiers);
               String embellishment = Modifier.toString(modifiers);

访问成员变量

下列方法返回Field类型的对象实例或数组,每个Field对象代表一个成员变量,利用Field对象可以操纵相应的成员变量

获取成员变量

获取权限为publicgetField(String name)    name为变量名
getFields()  
获取所有的(任意权限)
getDeclaredField(String name)
getDeclaredFields()

Field类中提供的常用方法

getName()  获得该Field类对应成员变量的名称
getType()  获得成员变量类型
get(Object obj)    获得指定对象实例obj中成员变量的值
set(Object obj, Object value)    将指定对象实例obj中成员变量的值设置为value
get数据类型(Object obj)    获得指定对象实例obj中类型为“数据类型”的成员变量的值
set数据类型(Object obj, 数据类型 value)    将指定对象obj中类型为“数据类型”的成员变量的值设置为value
setAccessible(boolean flag)    可以设置是否忽略权限直接访问private等私有成员变量
getModifiers()    获得可以解析出该成员变量修饰符的整数,解析方法见访问构造方法部分

访问方法

下列方法返回Method类型的对象实例或数组,每个Method对象代表一个方法,利用Method对象可以操纵相应的方法

获取构造方法

获取权限为publicgetMethod(String name, Class<?>...parameterTypes)    获取指定方法,要给定方法名和参数类型
getMethods()    获取全部方法
获取所有的(任意权限)
getDeclaredMethod(String name, Class<?>...parameterTypes)    获取指定方法,要给定方法名和参数类型
getDeclaredMethods()    获取全部方法

若要获取指定方法,需要根据该方法的方法名和参数类型访问,如一个参数依次为Stringint
对象实例.getDeclaredConstructor("print", String.class, int.class)
或
对象实例.getDeclaredConstructor("print", new Class[] {String.class, int.class})

Method类中提供的常用方法

getName()  获得该Method类对应方法的名称
getParameterType()  获得各个参数的类型,返回Class数组
getReturnType()  获得返回值类型,返回Class对象
getExceptionTypes()Class数组的形式获取该方法可能抛出的异常类型
invoke(Object obj, Object...args)    用指定参数args执行obj中的方法(Method类对应的)
isVarArgs()  查看方法是否支持可变数量参数,是truefalse
getModifiers()    获得可以解析出该方法修饰符的整数,解析方法见访问构造方法部分

Annotation功能

Annotation,即注释,可以用于类、构造方法、成员变量、方法等的声明中,不会影响程序运行,但会对编译器警告等辅助工具产生影响

定义Annotation类型

public @interface NoMemberAnnotation{}    定义关键字为"@interface",@+接口

挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑挖坑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值