java注解(Annotation)详解

注解(Annotation)简介

Annotation(注解)是JDK5.0 及以后版本引入的一个特性。注解是java 的一个新的类型(与接口很相似),它与类、接口、枚举是在同一个层次,它们都称作为java 的一个类型(TYPE)。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。它的作用非常的多,例如:进行编译检查、生成说明文档、代码分析等。

JDK提供的几个基本注解
a. @SuppressWarnings

该注解的作用是阻止编译器发出某些警告信息。
它可以有以下参数:
deprecation:过时的类或方法警告。
unchecked:执行了未检查的转换时警告。
fallthrough:当Switch 程序块直接通往下一种情况而没有Break 时的警告。
path:在类路径、源文件路径等中有不存在的路径时的警告。
serial:当在可序列化的类上缺少serialVersionUID 定义时的警告。
finally:任何finally 子句不能完成时的警告。
all:关于以上所有情况的警告。

b. @Deprecated

  该注解的作用是标记某个过时的类或方法。

c. @Override

  该注解用在方法前面,用来标识该方法是重写父类的某个方法。

元注解

a. @Retention

它是被定义在一个注解类的前面,用来说明该注解的生命周期。
它有以下参数:
RetentionPolicy.SOURCE:指定注解只保留在一个源文件当中。
RetentionPolicy.CLASS:指定注解只保留在一个class 文件中。
RetentionPolicy.RUNTIME:指定注解可以保留在程序运行期间。

b. @Target

它是被定义在一个注解类的前面,用来说明该注解可以被声明在哪些元素前。
它有以下参数:
ElementType.TYPE:说明该注解只能被声明在一个类前。
ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
ElementType.PACKAGE:说明该注解只能声明在一个包名前。


注解的生命周期

  一个注解可以有三个生命周期,它默认的生命周期是保留在一个CLASS 文件,但它也可以由一个@Retetion 的元注解指定它的生命周期。

a. java 源文件

  当在一个注解类前定义了一个@Retetion(RetentionPolicy.SOURCE)的注解,那么说明该注解只保留在一个源文件当中,当编译器将源文件编译成class 文件时,它不会将源文件中定义的注解保留在class 文件中。

b. class 文件中

  当在一个注解类前定义了一个@Retetion(RetentionPolicy.CLASS)的注解,那么说明该注解只保留在一个class 文件当中,当加载class 文件到内存时,虚拟机会将注解去掉,从而在程序中不能访问。

c. 程序运行期间

  当在一个注解类前定义了一个@Retetion(RetentionPolicy.RUNTIME)的注解,那么说明该注解在程序运行期间都会存在内存当中。此时,我们可以通过反射来获得定义在某个类上的所有注解。

注解的定义

一个简单的注解:
  public @interface Annotation01 {
    //定义公共的final静态属性
    .....
    //定以公共的抽象方法
    ......
  }

a. 注解可以有哪些成员

  注解和接口相似,它只能定义final 静态属性和公共抽象方法。

b. 注解的方法

1.方法前默认会加上public abstract
2.在声明方法时可以定义方法的默认返回值。
  例如:
  String color() default "blue";
  String[] color() default {"blue", "red",......}
3.方法的返回值可以有哪些类型
  8 种基本类型,String、Class、枚举、注解及这些类型的数组。

c. 使用注解(参照下面的注解使用)

注解的使用

  注解的使用分为三个过程。
  定义注解-->声明注解-->得到注解

a. 定义注解(参照上面的注解定义)
b. 声明注解

1. 在哪些元素上声明注解

如果定义注解时没有指定@Target 元注解来限制它的使用范围,那么该注解可以使用在ElementType 枚举指定的任何一个元素前。否则,只能声明在@Target 元注解指定的元素前。
一般形式:
@注解名()

2. 对注解的方法的返回值进行赋值

对于注解中定义的每一个没有默认返回值的方法,在声明注解时必须对它的每一个方法的返回值进行赋值。
一般形式:
@注解名(方法名=方法返回值,、、、、、、)
如果方法返回的是一个数组时,那么将方法返回值写在{}符号里
@注解名(方法名={返回值1,返回值2,、、、、、、},、、、、、、、)

3. 对于只含有value 方法的注解,在声明注解时可以只写返回值。

c. 得到注解

对于生命周期为运行期间的注解,都可以通过反射获得该元素上的注解实例。
1、声明在一个类中的注解
可以通过该类Class 对象的getAnnotation 或getAnnotations 方法获得。
2、声明在一个字段中的注解
通过Field 对象的getAnnotation 或getAnnotations 方法获得
3、声明在一个方法中的注解
通过Method 对象的getAnnotation 或getAnnotations 方法获得

代码示例:

 1 package Test_annotation;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 public class Test_1 {
 6     /*
 7      * 被注解的三个方法
 8      */
 9     @Test(id = 1, description = "hello method_1")
10     public void method_1() {
11     }
12 
13     @Test(id = 2)
14     public void method_2() {
15     }
16 
17     @Test(id = 3, description = "last method")
18     public void method_3() {
19     }
20 
21     /*
22      * 解析注解,将Test_1类 所有被注解方法 的信息打印出来
23      */
24     public static void main(String[] args) {
25         Method[] methods = Test_1.class.getDeclaredMethods();
26         for (Method method : methods) {
27             /*
28              * 判断方法中是否有指定注解类型的注解
29              */
30             boolean hasAnnotation = method.isAnnotationPresent(Test.class);
31             if (hasAnnotation) {
32                 /*
33                  * 根据注解类型返回方法的指定类型注解
34                  */
35                 Test annotation = method.getAnnotation(Test.class);
36                 System.out.println("Test( method = " + method.getName()
37                         + " , id = " + annotation.id() + " , description = "
38                         + annotation.description() + " )");
39             }
40         }
41     }
42 
43 }

 打印输出结果:

Test( method = method_1 , id = 1 , description = hello method_1 )
    Test( method = method_2 , id = 2 , description = no description )
    Test( method = method_3 , id = 3 , description = last method )

 总结

注解可以看成是一个接口,注解实例就是一个实现了该接口的动态代理类。注解大多是用做对某个类、方法、字段进行说明,标识的。以便在程序运行期间我们通过反射获得该字段或方法的注解的实例,来决定该做些什么处理或不该进行什么处理。

转载于:https://www.cnblogs.com/beanmoon/archive/2012/12/25/2832125.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java注解处理器(Annotation Processor)是Java语言提供的一种机制,用于在编译时扫描和处理注解信息。它可以自动扫描Java源代码中的注解,生成新的Java代码、XML文件或者其他类型的文件。 Java注解处理器可以用于很多方面,比如生成代码、检查代码、生成文档等等。下面我们来详细介绍一下Java注解处理器的使用。 1. 创建注解 首先,我们需要定义一个注解注解通常用来标记Java源代码中的某个元素,比如类、方法、变量等。注解的定义方式如下: ```java @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface MyAnnotation { String value(); } ``` 上面的代码定义了一个注解`MyAnnotation`,它有一个属性`value`。这个注解只能用于类上,它的生命周期为源代码级别。 2. 编写注解处理器 接下来,我们需要创建一个注解处理器,用来扫描和处理Java源代码中的注解信息。注解处理器必须实现`javax.annotation.processing.Processor`接口,同时还需要用`@SupportedAnnotationTypes`注解指定要处理的注解类型,用`@SupportedSourceVersion`注解指定支持的Java版本。 ```java @SupportedAnnotationTypes("MyAnnotation") @SupportedSourceVersion(SourceVersion.RELEASE_8) public class MyAnnotationProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (TypeElement annotation : annotations) { Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(annotation); for (Element element : elements) { if (element.getKind() == ElementKind.CLASS) { String className = element.getSimpleName().toString(); String packageName = processingEnv.getElementUtils().getPackageOf(element).toString(); String value = element.getAnnotation(MyAnnotation.class).value(); System.out.println("Found class " + packageName + "." + className + ", value = " + value); } } } return true; } } ``` 上面的代码是一个简单的注解处理器,它可以处理`MyAnnotation`注解,输出被注解的类的信息,包括类名、包名和注解的属性值。 3. 注册注解处理器 最后,我们需要在`META-INF/services/javax.annotation.processing.Processor`文件中注册注解处理器,这样编译器才能够找到它并使用它。这个文件的内容就是注解处理器的全限定类名,比如: ``` com.example.MyAnnotationProcessor ``` 4. 编译Java源代码 现在我们就可以使用注解处理器了。对于一个Java项目,我们需要将注解处理器打包成一个Jar文件,并将它添加到项目的classpath中。然后,在编译Java源代码时,我们需要指定`-processor`选项来告诉编译器要使用哪个注解处理器,比如: ``` javac -cp my-processor.jar -processor com.example.MyAnnotationProcessor MyAnnotatedClass.java ``` 上面的命令将会编译`MyAnnotatedClass.java`文件,并使用`com.example.MyAnnotationProcessor`注解处理器来处理其中的注解信息。 总结 Java注解处理器是一个非常强大的工具,它可以帮助我们自动化生成代码、检查代码、生成文档等等。使用注解处理器可以减少手写重复代码的工作量,提高代码的可维护性和可读性。需要注意的是,注解处理器只能用于编译时,不能用于运行时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值