Java中的反射机制

Java反射机制的概念与定义

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

Java反射机制的好处

在Java中,通过Java的反射机制,程序员可以更深入地控制程序的运行过程。 例如,可在程序运行时对用户输入的信息进行验证,还可以逆向控制程 序的执行过程。 另外,Java还提供了Annotation功能,该功能建立在反射机制的基 础上。本章对此也作了讲解,包括定义Annotation类型的方法和在程序 运行时访问Annotation信息的方法。为了便于读者理解,在讲解过程中 还结合了大量的实例。
.
众所周知,所有Java类均继承了Object类,在Object类中定义了一个 getClass()方法,该方法返回一个类型为Class的对象。例如下面的代码:
在这里插入图片描述
**利用Class类的对象textFieldC,可以访问用来返回该对象的textField 对象的描述信息。可以访问的主要描述信息如下图所示:
在这里插入图片描述
*说明:
在通过getFields()和getMethods()方法依次获得权限为public的成员 变量和方法时,将包含从超类中继承到的成员变量和方法;而通过方 法getDeclaredFields()和getDeclaredMethods()只是获得在本类中定义的 所有成员变量和方法。

下面为Java反射机制通过一写方法获取成员变量,成员方法的实现代码和常用方法。

.

1.获取成员变量

在通过下列一组方法访问成员变量时,将返回Field类型的对象或数 组。每个Field对象代表一个成员变量,利用Field对象可以操纵相应的成员变量。

			**如果是访问指定的成员变量,可以通过该成员变量的名称来访问。 例如,访问一个名称为birthday的成员变量,访问方法如下:**

在这里插入图片描述
Field类中提供的常用方法如下表所示:
在这里插入图片描述
.
.

2.获取成员方法

在通过下列一组方法访问方法时,将返回Method类型的对象或数 组。每个Method对象代表一个方法,利用Method对象可以操纵相应的方法。在这里插入图片描述
*说明:
如果是访问指定的方法,需要根据该方法的名称和入口参数的类型 来访问。例如,访问一个名称为print、入口参数类型依次为String和int 型的方法,通过下面两种方式均可实现:

*
objectClass.getDeclaredMethod(“print”, String.class, int.class); objectClass.getDeclaredMethod(“print”, new Class[] {String.class,int.class });
.

.
Method类中提供的常用方法如表16.5所示。
在这里插入图片描述
注意:
在反射中执行具有可变数量的参数的构造方法时,需要将入口参 数定义成二维数组。

.

.

.

了解与使用Annotation功能

1.Java中提供了Annotation功能,该功能可用于类、构造方法、成员 变量、方法、参数等的声明中。该功能并不影响程序的运行,但是会对 编译器警告等辅助工具产生影响。本节将介绍Annotation功能的使用方法。

首先是定义Annotation类型
1.1在定义Annotation类型时,也需要用到用来定义接口的interface关键 字,但需要在interface关键字前加一个“@”符号,即定义Annotation类型 的关键字为@interface,这个关键字的隐含意思是继承了 java.lang.annotation.Annotation接口。例如,下面的代码就定义了一个 Annotation类型。

在这里插入图片描述
.
1.2上面定义的Annotation类型@NoMemberAnnotation未包含任何成 员,这样的Annotation类型被称为marker annotation。下面的代码定义了 一个只包含一个成员的Annotation类型。

在这里插入图片描述
其中String:成员类型。可用的成员类型有String、Class、primitive、enumerated和annotation,以及所列类型的数组。
value:成员名称。如果在所定义的Annotation类型中只包含一个 成员,通常将成员名称命名value。

说明:
在定义Annotation类型时,还可以通过Annotation类型@Target来设 置Annotation类型适用的程序元素种类。如果未设置@Target,则表示适 用于所有程序元素。枚举类ElementType中的枚举常量用来设置 @Targer,如下图所示。
在这里插入图片描述
通过Annotation类型@Retention可以设置Annotation的有效范围。枚举类RetentionPolicy中的枚举常量用来设置@Retention,如表16.7所示。 如果未设置@Retention,Annotation的有效范围为枚举常量CLASS表示 的范围。
如果在定义Annotation类型时将@Retention设置为 RetentionPolicy.RUNTIME,那么在运行程序时通过反射就可以获取到 相关的Annotation信息,如获取构造方法、字段和方法的Annotation信息。

.
.
.

小结:

1.反射是框架设计的灵魂
* 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
* 反射:将类的各个组成部分封装为其他对象,这就是反射机制
*
2.以后大多数时候,我们会使用注解,而不是自定义注解
3.注解不是程序的一部分,可以理解为注解就是一个标签

4.反射在以后的框架中非常的重要,我们需要掌握了Java反射机制的使用方 法。利用Java反射机制,可以在程序运行时访问类的所有描述信息(经常需要访问的有类的构造方法、成员变量和方法),实现逆向控制程序 的执行过程。利用Annotation功能,可以对类、构造方法、成员变量、 方法、参数等进行注释,在程序运行时通过反射可以读取这些信息,根 据读取的信息也可以实现逆向控制程序的执行过程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值