java 8 重复注解报错,重复注解 · Java 8 Document Translation · 看云

在某些情况下,您希望将相同的注解应用于声明或类型。从Java SE 8发行版开始,重复注解使您可以执行此操作。

例如,您正在编写代码以使用计时器服务,该服务使您能够在给定时间或某个时间表上运行方法,与UNIX `cron`服务类似。现在,您想设置一个计时器,在每月的最后一天以及每个星期五的晚上11点运行方法`doPeriodicCleanup`。要设置计时器运行,请创建`@Schedule`注解并将其应用两次到`doPeriodicCleanup`方法。第一次使用指定了月份的最后一天,第二次使用指定了星期五的下午11点,如以下代码示例所示:

```java

@Schedule(dayOfMonth="last")

@Schedule(dayOfWeek="Fri", hour="23")

public void doPeriodicCleanup() { ... }

```

前面的示例将注解应用于方法。您可以在任何使用标准注解的地方使用重复注解。例如,您有一个处理未授权访问异常的类。您使用一个`@Alert`注解为管理员注册类,另一个注册给管理员:

```java

@Alert(role="Manager")

@Alert(role="Administrator")

public class UnauthorizedAccessException extends SecurityException { ... }

```

出于兼容性原因,重复注解存储在由Java编译器自动生成的*容器注解*(container annotation)中。为了让编译器执行此操作,代码中需要两个声明。

**Step 1: 声明一个可重复注解类型**

-

注解类型必须用`@Repeatable`元注解标记。以下示例定义了一个自定义`@Schedule`可重复注解类型:

```java

import java.lang.annotation.Repeatable;

@Repeatable(Schedules.class)

public @interface Schedule {

String dayOfMonth() default "first";

String dayOfWeek() default "Mon";

int hour() default 12;

}

```

圆括号中的`@Repeatable`元注释的值是Java编译器为存储重复注解而生成的容器注解的类型。在此示例中,包含的注解类型是`Schedules`,因此重复的`@Schedule`注解存储在`@Schedules`注解中。

在声明中应用相同的注解而不首先声明它是可重复的,将导致编译时错误。

**Step 2: 声明包含注解类型**

-

包含注解类型必须具有数组类型的`value `元素。数组类型的组件类型必须是可重复的注解类型。包含注释类型的`Schedules `声明如下:

```java

public @interface Schedules {

Schedule[] value();

}

```

**检索注解**

-

Reflection API中有几种可用于检索注解的方法。返回单个注解(如[`AnnotatedElement.getAnnotation(Class )`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html#getAnnotation-java.lang.Class-))的方法的行为不会发生变化,因为它们只会在请求类型的注解存在时返回单个注解。如果存在多个请求类型的注解,您可以通过首先获取它们的容器注解来获取它们。通过这种方式,遗留代码继续工作。在Java SE 8中引入了其他方法,这些方法扫描容器注解以一次返回多个注解,例如[`AnnotatedElement.getAnnotationsByType(Class `)](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html#getAnnotationsByType-java.lang.Class-)。有关所有可用方法的信息,请参阅[`AnnotatedElement`](https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html)类规范。

**设计注意事项**

-

设计注解类型时,必须考虑该类型注解的基数。现在可以使用同一个注解一次或零次,或者,如果注解的类型被标记为`@Repeatable`,则可以多次使用。也可以通过使用`@Target`元注解来限制注解类型的使用位置。例如,您可以创建只能在方法和字段上使用的可重复注解类型。仔细设计注解类型非常重要,以确保使用注解的程序员发现它尽可能灵活和强大。

### 解决 Dev-C++ 中文注释显示乱码的方法 为了使 Dev-C++ 正确显示中文注释并防止出现乱码现象,需调整编辑器编码设置以及编译选项。 #### 调整编辑器编码设置 在 Embarcadero Dev-C++ 的界面中,通过路径 **工具 -> 编辑器选项** 进入配置页面,在该页面内将新文档编码 (New Document Encoding) 更改为 UTF-8[^1]。这一改动确保新建文件默认采用支持多字节字符集的编码方式保存,从而有效减少因编码差异引发的文字失真情况。 #### 修改编译参数 除了更改编辑器内部设定外,还需针对程序执行期间所使用的字符集做出相应调整。具体操作为:进入 **工具 -> 编译选项**, 在链接器或其他适当位置添加 `-fexec-charset=gbk` 参数[^2]。此举告知 GCC/G++ 使用 GBK 字符集作为目标平台的标准输出输入流,默认情况下会覆盖原有的 ASCII 或 ISO Latin 设置,使得最终生成的应用能够正确解析和展示简体中文字符串。 #### 取消特定翻译缺失项的选择 另外一个重要步骤是在上述提到过的 “编辑器选项” 对话框里找到名为 "显示" 的标签页,并从中移除 ID 27071 translation missing 前面的小勾号[^3]。这一步骤可以消除某些特殊条件下可能出现的影响正常视图渲染的因素。 完成以上几项修改之后重启 IDE 应用即可验证效果;如果一切顺利的话,现在应该可以在源代码文件里面看到清晰可读的中文注解而不会再遭遇恼人的乱码问题了。 ```cpp // 测试用 C++ 文件, 包含中文注释 #include <iostream> int main() { std::cout << "你好世界"; // 输出一句简单的问候语句 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值