Java最高

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程

1.概述

注释,一种可以添加到Java代码中的元数据形式。这些注释可以在编译时处理并嵌入到类文件中,还是可以在运行时使用保留和访问反射

在本文中,我们将讨论如何进行更改注释在运行时使用反射。对于本例,我们将使用类级注释。

2.注释

Java允许创建新的注释使用现有的。在最简单的形式中,注释表示为@后跟注释名的符号:

@Override

让我们创建自己的注释迎宾:

@Retention(RetentionPolicy.RUNTIME) public @interface Greeter {public String greet() default "";}

现在,我们将创建一个Java类问候哪一个使用了类级别注释:

@Greeter(greet="Good morning") public class greeting {}

现在,我们将使用反射访问注释值。Java类提供一种方法getAnnotation访问类的注释:

greeting = greeting .class. getannotation (Greeter.class);system . out。println("Hello there, " + greeting .greet() + " !!");

3.改变注释

Java类维护一个用于管理注释的映射注释类作为键和注释对象作为值:

<类<地图吗?extends Annotation>, Annotation> map;

我们将在运行时更新这个映射以更改注释。访问此映射的方法在不同的JDK实现中有所不同。我们将针对JDK7和JDK8讨论它。

3.1。JDK 7实现

Java类有场注释。由于这是一个私有字段,要访问它,我们必须将字段的可访问性设置为真正的。Java提供了方法getdeclaredfield.通过名称访问任何字段:

字段注释= Class.class.getDeclaredField(注释);annotations.setAccessible(真正的);

现在,让我们访问class的annotation map迎宾:

<类<地图吗?扩展注释>,注释>映射= annotations.get(targetClass);

现在,这是映射,它包含关于所有注释及其值对象的信息。金宝搏官网188be我们想要改变迎宾的注释值,我们可以通过更新注释对象来实现迎宾类:

地图。把(targetAnnotation targetValue);

3.2。JDK 8实现

Java 8实现存储注释类内部的信息AnnotationData。我们可以使用此对象使用annotationData方法。我们将为annotationData方法真正的因为它是一种私人方法:

方法方法= Class.class。getDeclaredMethod (ANNOTATION_METHOD, null);method.setAccessible(真正的);

现在,我们可以访问注释字段。由于该字段也是私有字段,我们将可访问性设置为真正的:

Field Annotations = AnnotationData.getClass()。getDeclaredfield(注释);annotations.setAccessible(真正的);

该字段具有注释缓存映射,用于存储注释类和值对象。让我们改变:

<类<地图吗?extends Annotation>, Annotation> map = annotations.get(annotationData); / /获取注释地图。把(targetAnnotation targetValue);

4.应用程序

让我们举个例子:

greeting = greeting .class. getannotation (Greeter.class);System.err。println("Hello there, " + greeting .greet() + " !!");

这将是问候“Good morning”,因为这是我们提供给annotation的价值。
现在,我们将再创建一个对象迎宾键入值为“Good evening”:

targetValue = new DynamicGreeter("晚上好");

让我们用新值更新注释映射:

alterAnnotationValueJDK8 (Greetings.class Greeter.class targetValue);

让我们再次检查问候值:

问候= Greetings.class.getAnnotation (Greeter.class);System.err。println("Hello there, " + greeting .greet() + " !!");

它会以“晚上好”来打招呼。

5.结论

Java实现使用两个数据字段来存储注释数据:注释,声明伙伴。这两者之间的区别是:首先还存储来自父类的注释,然后只存储当前类的注释。

作为实施getAnnotation我们这里使用的JDK 7和JDK 8有所不同注释为简单起见,使用字段映射。

而且,与往常一样,可以获得实现的源代码在Github

Java底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
评论在本文上关闭!