java 注解(翻译自Java Tutorials)

本文详细介绍了Java注解的用途及应用场景,包括文档生成、编译器信息传递、编译时和部署时处理以及运行时检查等。同时,还探讨了如何自定义注解类型,并展示了几个内置注解类型的使用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/03/2800487.html

英文出自 http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html

注解为程序提供数据,但是,它不是程序的一部分。它们不会在注解的代码直接影响应用。

注解有如下的使用

  • 编译器信息— 编译器用注解检测到错误或抑制警告。
  • 编译时和部署时的处理 — 软件工具可以处理注释的信息来生成代码,XML文件,等等。
  • 运行时处理 — 有些注解是在运行时进行检查.

注解可以应用到程序声明的类,字段,方法,和其他程序元素。

@Author(
   name = "Benjamin Franklin",
   date = "3/27/2003"
)
class MyClass() { }
或

@SuppressWarnings(value = "unchecked")
void myMethod() { }

如果有一个元素取名为value,那么这个名字可以被忽略,例如:

@SuppressWarnings("unchecked")
void myMethod() { }

如果注解没有元素,小括号可以被忽略,例如:

@Override
void mySuperMethod() { }
 

文档

许多注解取代了本来已经在代码中的注释。

假设传统的软件组在每个类的类体的开始,使用注释提供了重要的信息:

public class Generation3List extends Generation2List {

   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}

使用注解提供一样的元数据,首先要声明一个注解类型,语法是:

@interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

注解的声明,就像在interface声明前面添加一个@字符(@是AT,即Annotation Type)。注解类型,其实是一种形式的接口,它会覆盖在后面的课程中。就目前而言,你不需要了解接口

注解的声明的正文,包括注解元素的声明,看起来很像方法。注意,这里可以定义可选的默认值。

一旦注解定义好了,就可以在使用注解时,填充注解的值,就像这样:

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}

注意:要让@ClassPreamble的信息出现在Javadoc生成的文档,必须使用@Documented注解定义@ClassPreamble

// import this to use @Documented
import java.lang.annotation.*;

@Documented
@interface ClassPreamble {

   // Annotation element definitions
   
}

 

编译器使用注解

有这么几种注解类型通过语言规范预定义:@Deprecated, @Override, @SuppressWarnings。

@Deprecated@Deprecated注解指示,标识的元素是废弃的,不应该再使用。编译器会在任何使用到@Deprecated的类,方法,字段的程序,产生警告。当元素是废弃的,它也应该使用Javadoc的@deprecated标识文档化,,如下面的例子。两个Javadoc注释和注解中的“@”符号的使用不是巧合 - 它们是相关的概念上。另外,请注意Javadoc标记开始用小写字母“D”和注解开始以大写字母“D”。

   // Javadoc comment follows
    /**
     * @deprecated
     * explanation of why it
     * was deprecated
     */
    @Deprecated
    static void deprecatedMethod() { }
}
@Override—@Override注解通知编译器,覆盖父类声明的元素。
   // mark method as a superclass method
   // that has been overridden
   @Override 
   int overriddenMethod() { }

 

虽然不要求在覆盖方法时,必须使用注解,但是它可以避免错误。如果一个方法标记为@Override,但是无法正确覆盖父类的任何方法,编译器会产生错误。

@SuppressWarnings@SuppressWarnings注解,告诉编译器,抑制正常情况下会产生的特定的警告。下面的例子,一个废弃的方法被使用,编译器正常会产生警告,而这个情况下,这个注解导致警告会被抑制。

   // use a deprecated method and tell 
   // compiler not to generate a warning
   @SuppressWarnings("deprecation")
    void useDeprecatedMethod() {
        // deprecation warning
        // - suppressed
        objectOne.deprecatedMethod();
    }

每个编译器的警告属于一个类别。java语言规范有两个类别:"deprecation" 和"unchecked"。"unchecked" 会在使用以前的写的泛型的遗留代码进行交互时,产生警告。抑制更多类别的警告,使用下面的语法:

@SuppressWarnings({"unchecked", "deprecation"})

 

注解处理

注解的更高级使用,包括注解处理,读一个java程序,根据注解执行一些动作。例如,它可以产生辅助的源代码,减轻程序员创建的样板代码,始终遵循可预测的模式的工作量。为了推动这个工作,JDK 5.0包含了一个注解处理工具,成为apt。在JDK 6.0中,apt是java编译器的标准的一部分。

运行期使用注解,注解类型本身必须使用@Retention(RetentionPolicy.RUNTIME)注解,例如:

import java.lang.annotation.*; 

@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationForRuntime {

   // Elements that give information
   // for runtime processing
   
}

转载于:https://www.cnblogs.com/ggjucheng/archive/2012/12/03/2800487.html

### Java 注解的使用方法和示例 #### 什么是注解注解(Annotation)是一种元数据形式,它提供了关于程序代码的信息,但并不直接影响程序本身的运行。它可以应用于包、类、构造函数、方法、变量等。 --- #### 注解的基本特性 注解本身不会改变程序的功能,但它可以被其他工具或框架读取并执行特定的操作。例如,在编译阶段通过注解处理器生成额外的代码或者在运行时动态修改行为[^1]。 --- #### 自定义注解的语法 要创建自定义注解,需使用 `@interface` 关键字。以下是其基本结构: ```java public @interface MyAnnotation { String value() default ""; // 默认值可选 String name(); // 属性名称 int age(); // 属性年龄 String[] roles() default {}; // 数组类型属性 } ``` 此例子展示了如何定义一个带有多种属性类型的注解,包括字符串、整数以及字符串数组[^1]。 --- #### 使用自定义注解 一旦定义好了一个注解,就可以像下面这样将其应用到类、方法或其他元素上: ```java @MyAnnotation(value = "测试", name = "张三", age = 25, roles = {"admin", "user"}) public void someMethod() { // 方法实现 } // 如果只有一个名为 'value' 的属性,则可以直接省略属性名 @MyAnnotation("测试") public void anotherMethod() { // 方法实现 } ``` 当仅有一个 `value` 属性需要赋值时,允许简化书写方式[^1]。 --- #### 处理注解的方式 处理注解可以通过两种主要途径完成:**编译期处理** 和 **运行时反射机制**。 ##### 编译期处理 某些情况下可以在编译期间利用注解来增强代码质量。比如 JDK 提供的标准注解之一——`@Override`,用来确保子类正确覆盖了父类中的某个方法;如果未找到匹配的方法签名,则会抛出错误提示给开发者[^3]。 另一个典型场景涉及正则表达式的验证逻辑。如下所示的是基于正则表达式模式匹配的例子[^2]: ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample { public static void main(String[] args) { String text = "ababccc"; Pattern greedyPattern = Pattern.compile("ab.*c"); Matcher matcherGreedy = greedyPattern.matcher(text); while (matcherGreedy.find()) { System.out.println(matcherGreedy.group()); } Pattern nonGreedyPattern = Pattern.compile("ab.*?c"); Matcher matcherNonGreedy = nonGreedyPattern.matcher(text); while (matcherNonGreedy.find()) { System.out.println(matcherNonGreedy.group()); } } } ``` 这里分别演示了贪婪与懒惰量词的区别效果。 ##### 运行时处理 为了能够在应用程序启动之后仍然访问这些标注信息,我们需要借助于 Java 反射 API 来获取它们。这通常要求我们在声明注解的时候指定保留策略为 RUNTIME: ```java import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface RuntimeAnnotation { String message(); } ``` 随后我们便能编写一段简单的单元测试去检索此类元数据: ```java public class ReflectionDemo { @RuntimeAnnotation(message="这是一个运行时期间可用的注解实例") public void annotatedMethod(){} public static void main(String[] args)throws Exception{ Class<ReflectionDemo> clazz=ReflectionDemo.class; for(java.lang.reflect.Method method :clazz.getDeclaredMethods()){ if(method.isAnnotationPresent(RuntimeAnnotation.class)){ RuntimeAnnotation annotation= method.getAnnotation(RuntimeAnnotation.class); System.out.println(annotation.message()); } } } } ``` 上述代码片段中体现了如何提取由用户自定義之運行時註釋所提供的資訊[^4]。 --- #### 常见标准注解及其用途 除了前面提到过的几个外,还有许多其他的预置选项可供选用,如[@Deprecated](https://docs.oracle.com/javase/tutorial/java/annotations/basics.html),用于标记那些不推荐再继续使用的API组件;又或者是 [@SuppressWarnings]("http://tutorials.jenkov.com/java/suppresswarnings.html") ,旨在抑制不必要的告警消息输出等等[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值