java《注解解析》
java《注解解析》

Java注解(Annotation)(1) Annotation(注释)是JDK5.0及以后版本引入的。
它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。
注释是以‘@注释名’在代码中存在的,根据注释参数的个数,我们可以将注释分为:标记注释、单值注释、完整注释三类。
它们都不会直接影响到程序的语义,只是作为注释(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。
另外,你可以在编译时选择代码里的注释是否只存在于源代码级,或者它也能在class 文件中出现。
元数据的作用如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。
基本内置注释@OverrideJava代码1. package com.iwtxokhtd.annotation;2. /**3. * 测试Override注解4. * @author Administrator5. *6. */7. public class OverrideDemoTest {8.9. //@Override10. public String tostring(){11. return "测试注释";12. }13. }package com.iwtxokhtd.annotation; /*** 测试Override注解* @author Administrator**/public class OverrideDemoTest {//@Overridepublic String tostring(){return "测试注释";}}@Deprecated的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能,准确的说,它还不如javadoc @deprecated,因为它不支持参数,使用@Deprecated的示例代码示例如下:Java代码1. package com.iwtxokhtd.annotation;2. /**3. * 测试Deprecated注解4. * @author Administrator5. *6. */7. public class DeprecatedDemoTest {8. public static void main(String[] args) {9. //使用DeprecatedClass里声明被过时的方法10. DeprecatedClass.DeprecatedMethod();11. }12. }13. class DeprecatedClass{14. @Deprecated15. public static void DeprecatedMethod() {16. }17. }package com.iwtxokhtd.annotation;/*** 测试Deprecated注解* @author Administrator**/public class DeprecatedDemoTest { public static void main(String[] args) {//使用DeprecatedClass里声明被过时的方法DeprecatedClass.DeprecatedMethod();}}class DeprecatedClass{@Deprecatedpublic static void DeprecatedMethod() { }}@SuppressWarnings,其参数有:deprecation,使用了过时的类或方法时的警告unchecked,执行了未检查的转换时的警告fallthrough,当Switch 程序块直接通往下一种情况而没有Break 时的警告path,在类路径、源文件路径等中有不存在的路径时的警告serial,当在可序列化的类上缺少serialVersionUID 定义时的警告finally ,任何finally 子句不能正常完成时的警告all,关于以上所有情况的警告Java代码1. package com.iwtxokhtd.annotation;2.3. import java.util.ArrayList;4. import java.util.List;5.6. public class SuppressWarningsDemoTest {7.8. public static List list=new ArrayList();9. @SuppressWarnings("unchecked")10. public void add(String data){11. list.add(data);12. }13. }package com.iwtxokhtd.annotation;import java.util.ArrayList;import java.util.List;public class SuppressWarningsDemoTest {public static List list=new ArrayList();@SuppressWarnings("unchecked") public void add(String data){list.add(data);}}(2)自定义注释它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为@interface,如下例:Java代码1. public @interface NewAnnotation {2. }public @interface NewAnnotation {}使用自定义的注释类型Java代码1. public class AnnotationT est {2. @NewAnnotation3. public static void main(String[] args) {4. }5. }public class AnnotationT est {@NewAnnotationpublic static void main(String[] args) { }}为自定义注释添加变量Java代码1. public @interface NewAnnotation {2. String value();3. }public @interface NewAnnotation {String value();}Java代码1. public class AnnotationT est {2. @NewAnnotation("main method")3. public static void main(String[] args) {4. saying();5. }6. @NewAnnotation(value = "say method")7. public static void saying() {8. }9. }public class AnnotationT est {@NewAnnotation("main method")public static void main(String[] args) {saying();}@NewAnnotation(value = "say method")public static void saying() {}}定义一个枚举类型,然后将参数设置为该枚举类型,并赋予默认值Java代码1. public @interface Greeting {2. public enum FontColor{3. BLUE,RED,GREEN4. };5. String name();6. FontColor fontColor() default FontColor.RED;}7. }public @interface Greeting {public enum FontColor{BLUE,RED,GREEN};String name();FontColor fontColor() default FontColor.RED;}}这里有两种选择,其实变数也就是在赋予默认值的参数上,我们可以选择使用该默认值,也可以重新设置一个值来替换默认值1. @NewAnnonation("main method")2. public static void main(String[] args) {3. saying();4. sayHelloWithDefaultFontColor();5. sayHelloWithRedFontColor();6.7. }8. @NewAnnonation("say method")9. public static void saying(){10.11. }12. //此时的fontColor为默认的RED13. @Greeting(name="defaultfontcolor")14. public static void sayHelloWithDefaultFontColor() {15.16. }17. //现在将fontColor改为BLUE18. @Greeting(name="notdefault",fontColor=Greeting.FontColor.BLUE)19. public static void sayHelloWithRedFontColor() {20.@NewAnnonation("main method")public static void main(String[] args) {saying();sayHelloWithDefaultFontColor(); sayHelloWithRedFontColor();}@NewAnnonation("say method")public static void saying(){}//此时的fontColor为默认的RED@Greeting(name="defaultfontcolor")public static void sayHelloWithDefaultFontColor() {}//现在将fontColor改为BLUE@Greeting(name="notdefault",fontColor=Greeting.FontColor.BLUE) public static void sayHelloWithRedFontColor() {}(3)注释的高级应用限制注释的使用范围用@T arget指定ElementType属性Java代码1. package ng.annotation;2. public enum ElementType {3. TYPE,4. // 用于类,接口,枚举但不能是注释5. FIELD,6. // 字段上,包括枚举值7. METHOD,8. // 方法,不包括构造方法9. PARAMETER,10. // 方法的参数11. CONSTRUCTOR,12. //构造方法13. LOCAL_VARIABLE,14. // 本地变量或catch语句15. ANNOTATION_TYPE,16. // 注释类型(无数据)17. PACKAGE18. // Java包19. }package ng.annotation; public enum ElementType { TYPE,// 用于类,接口,枚举但不能是注释FIELD,// 字段上,包括枚举值METHOD,// 方法,不包括构造方法PARAMETER,// 方法的参数CONSTRUCTOR,//构造方法LOCAL_VARIABLE,// 本地变量或catch语句ANNOTATION_TYPE,// 注释类型(无数据)PACKAGE// Java包}注解保持性策略Java代码1. //限制注解使用范围2. @T arget({ElementType.METHOD,ElementType.CONSTRUCTOR})3. public @interface Greeting {4.5. //使用枚举类型6. public enum FontColor{7. BLUE,RED,GREEN8. };9. String name();10. FontColor fontColor() default FontColor.RED;11. }//限制注解使用范围@Target({ElementType.METHOD,ElementType.CONSTRUCTOR}) public @interface Greeting {//使用枚举类型public enum FontColor{BLUE,RED,GREEN};String name();FontColor fontColor() default FontColor.RED;}在Java编译器编译时,它会识别在源代码里添加的注释是否还会保留,这就是RetentionPolicy。
java 注释详解

Java中的注释是用来为代码添加说明的,有助于其他开发者理解代码的功能和实现方式。
Java中的注释可以分为两种:单行注释和多行注释。
1. 单行注释:单行注释以双斜杠(//)开头,只能注释一行代码。
例如:
```java
// 这是一个单行注释
System.out.println("Hello, world!"); // 这也是一个单行注释
```
2. 多行注释:多行注释以 /* 开始,以 */ 结束,可以注释多行代码。
例如:
```java
/* 这是一个
多行注释 */
System.out.println("Hello, world!"); /* 这也是一个多行注释 */
```
除了这两种常见的注释方式,Java还支持文档注释,也称为Javadoc注释,它以 /** 开始,以 */ 结束。
这种注释通常用于生成API文档。
例如:
```java
/**
* 这是一个文档注释,用于描述类的功能和属性。
* @param name 参数的名称和类型
* @return 返回值类型和描述
*/
public String greet(String name) {
return "Hello, " + name + "!";
}
```
文档注释可以被特殊的Javadoc工具解析,生成HTML格式的API文档。
java注解详解

java注解详解
注解(Annotation)是一种特殊的语言结构,它是Java5.0引入的一项特性,用来在不改变原有类与继承关系的前提下,用另外一种形式,对已有程序进行扩展和补充。
Java注解具有用反射机制实现,可以在编译和运行期都可以涉及到的特性,使得所编写的程序实现更加灵活,功能更加强大。
可以使用注解来给程序做出标记,可以用他们在编译时进行验证,也可以在运行期间进行一些额外操作。
Java注解可以用来分发在代码中,以便作为编译器或虚拟机的元数据使用,以确定程序的行为。
Java注解是一种编译时注解,它们可以通过诸如javac和JavaDoc这样的程序来被处理和处理,因此可以检测和强化程序的可读性和可维护性。
Java注解可以提升Java编程权限,在设计阶段用来标记Class和Method,可以让开发者做到专注于业务场景,而不是去考虑部署上的问题。
另外,使用注解可以提升程序的拓展性,有利于开发者与维护人员之间的轻松沟通,没有必要太多时间花在分析和理解原来的代码上,从而极大地提升编码效率。
总之,Java注解无处不在,是Java开发者每天要使用的技术,它可以帮助我
们加强了对程序的可读性,提高程序的健壮性,优化程序的运行效率,使整个开发质量大大提升,实现更高效更高质量的软件开发及维护。
java自定义注解动态解析获取方法参数值

java自定义注解动态解析获取方法参数值《Java自定义注解动态解析获取方法参数值》在Java编程中,注解是一种非常有用的工具,它可以用来给程序元素添加元数据。
在一些情况下,我们可能需要动态解析获取方法的参数值,这就需要使用自定义注解来实现。
本文将围绕这一主题展开讨论,并逐步深入探讨如何在Java中实现动态解析获取方法参数值的过程。
1. 初始理解:什么是自定义注解自定义注解是一种由程序员创建的注解类型,它可以用来给程序元素打上标记,从而能够在运行时通过反射对这些注解进行解析和处理。
在Java中,自定义注解通常通过 @interface 关键字来定义,可以包含成员变量、方法等信息。
2. 深入探讨:自定义注解的结构和定义在讨论如何动态解析获取方法参数值之前,我们首先要了解自定义注解的结构和定义方式。
一个标准的自定义注解包括注解名称、成员变量和相关的注解方法。
通过给出一些实际的例子,在这一部分我们将详细讲解如何定义一个自定义注解,并讨论其中的注意事项和最佳实践。
3. 动态解析获取方法参数值的需求场景动态解析获取方法参数值的需求通常出现在一些特定的业务场景中,例如在AOP编程、参数校验、日志记录等方面。
在这一部分,我们将围绕这些需求场景,详细分析为什么需要动态获取方法参数值,以及它的实际应用场景和作用。
4. 实现过程:使用自定义注解实现动态解析获取方法参数值在这一部分,我们将通过具体的代码实例,演示如何使用自定义注解来实现动态解析获取方法参数值。
我们将讨论自定义注解的定义和使用方式,以及如何在运行时通过反射来获取方法参数值。
我们还将讨论其中涉及到的技术难点和解决方案。
5. 总结回顾:对Java自定义注解动态解析获取方法参数值的全面理解通过本文的讨论,我们已经深入地了解了自定义注解的定义和使用,以及动态解析获取方法参数值的实现过程。
在这一部分,我们将对本文内容进行总结和回顾,从而全面、深刻和灵活地理解这一主题。
Java中lombok的@Builder注解的解析与简单使用详解

Java中lombok的@Builder注解的解析与简单使⽤详解Lombok中@Builder⽤法1、建造者模式简介:Builder 使⽤创建者模式⼜叫建造者模式。
简单来说,就是⼀步步创建⼀个对象,它对⽤户屏蔽了⾥⾯构建的细节,但却可以精细地控制对象的构造过程。
2、注解类Builder.java注释:* The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class* that contains a member which is annotated with {@code @Builder}.* <p>* If a member is annotated, it must be either a constructor or a method. If a class is annotated,* then a private constructor is generated with all fields as arguments* (as if {@code @AllArgsConstructor(access = AccessLevel.PRIVATE)} is present* on the class), and it is as if this constructor has been annotated with {@code @Builder} instead.* Note that this constructor is only generated if you haven't written any constructors and also haven't* added any explicit {@code @XArgsConstructor} annotations. In those cases, lombok will assume an all-args* constructor is present and generate code that uses it; this means you'd get a compiler error if this* constructor is not present.在企业开发中,⼀般在领域对象实体上标注@Builder,其作⽤就相当于@AllArgsConstructor(access =AccessLevel.PRIVATE),@Builder⼀般与@Getter结合使⽤。
教科书级讲解,秒懂最详细Java的注解

教科书级讲解,秒懂最详细Java的注解所有知识体系⽂章,已收录,欢迎Star!再次感谢,愿你早⽇进⼊⼤⼚!GitHub地址:Java注解注解(Annotation),也叫元数据。
⼀种代码级别的说明。
它是JDK1.5及以后版本引⼊的⼀个特性,与类、接⼝、枚举是在同⼀个层次。
它可以声明在包、类、字段、⽅法、局部变量、⽅法参数等的前⾯,⽤来对这些元素进⾏说明,注释。
编写⽂档⾸先,我们要知道Java中是有三种注释的,分别为单⾏注释、多⾏注释和⽂档注释。
⽽⽂档注释中,也有@开头的元注解,这就是基于⽂档注释的注解。
我们可以使⽤javadoc命令来⽣成doc⽂档,此时我们⽂档的内元注解也会⽣成对应的⽂档内容。
这就是编写⽂档的作⽤。
代码分析我们频繁使⽤之⼀,也是包括使⽤反射来通过代码⾥标识的元数据对代码进⾏分析的,此内容我们在后续展开讲解。
编译检查⾄于在编译期间在代码中标识的注解,可以⽤来做特定的编译检查,它可以在编译期间就检查出“你是否按规定办事”,如果不按照注解规定办事的话,就会在编译期间飘红报错,并予以提⽰信息。
可以就可以为我们代码提供了⼀种规范制约,避免我们后续在代码中处理太多的代码以及功能的规范。
⽐如,@Override注解是在我们覆盖⽗类(⽗接⼝)⽅法时出现的,这证明我们覆盖⽅法是继承于⽗类(⽗接⼝)的⽅法,如果该⽅法稍加改变就会报错;@FunctionInterface注解是在编译期检查是否是函数式接⼝的,如果不遵循它的规范,同样也会报错。
3.1 内置注解分类3.2 @Override注解标记在成员⽅法上,⽤于标识当前⽅法是重写⽗类(⽗接⼝)⽅法,编译器在对该⽅法进⾏编译时会检查是否符合重写规则,如果不符合,编译报错。
这⾥解释⼀下@Override注解,在我们的Object基类中有⼀个⽅法是toString⽅法,我们通常在实体类中去重写此⽅法来达到打印对象信息的效果,这时候也会发现重写的toString⽅法上⽅就有⼀个@Override注解。
java 注解详解

java 注解详解Java注解是一种用于给程序中的元素打标签和注释的方法。
它们提供了一种简单而强大的机制,可以将元数据与程序元素(类、方法、变量等)相关联。
本文将深入探讨Java注解的概念、语法、使用场景和常见应用。
Java注解的概念Java注解(Annotation)是Java SE5中新增的一种语言特性,它可以在Java源代码中以注释的形式存在,并且可以被编译器、工具和运行时环境所识别和处理。
Java注解是一种元数据(metadata)的形式,它包含了程序元素的附加信息,比如类型、访问权限、默认值等等。
Java注解的语法Java注解的语法比较简单,它使用了@符号作为前缀,后面跟着注解名和一对括号。
注解的参数可以是一个或多个键值对,键名和值之间用等号连接。
例如:@MyAnnotation(key1 = 'value1', key2 = 'value2')Java注解的参数可以有默认值,如果在使用注解时不指定某些参数的值,则使用默认值。
例如:@MyAnnotation()Java注解也可以嵌套使用,即一个注解可以作为另一个注解的参数。
例如:@MyAnnotation(@NestedAnnotation)Java注解的使用场景Java注解有多种使用场景,它们可以用于不同的目的,比如:1. 提供编译期间的静态检查和类型检查;2. 自定义注解,用于标记程序中的特定元素,比如类、方法、参数、变量等;3. 标记过时的代码或不建议使用的代码;4. 生成文档或代码;5. 提供运行时期间的动态处理和反射操作;6. 用于测试和调试。
Java注解的常见应用Java注解在实际应用中有很多用途,以下是其中的几个常见应用:1. @Override注解:用于标记子类中重写父类方法的情况,编译器会检查该方法是否符合重写规则。
2. @Deprecated注解:用于标记不建议使用的方法或类,编译器会生成警告信息,提醒程序员使用其他方法或类。
Java 注解分析

Android注解分析Android注解分析 (1)前言 (3)一、定义 (4)二、作用 (5)三、类型 (6)1.Standard Annotation (6)2.Meta Annotation (6)3.Custom Annotation (7)四、注解的实现原理 (8)1.自定义Annotation: (9)2.自定义注解的使用 (10)3.注解的解析 (11)总结 (16)前言无论是在学习Java项目还是Android(基于Java)项目的时候,都会碰到大量的注解,这些注解在项目中的作用可谓神奇,一行简简单单的声明居然就帮我们做掉了大量重复的工作,实在令人感叹!可是个人对于注解的理解一直停留在使用的层面,对于其背后真正的实现原理一直不甚清楚,甚至可以说是一无所知。
为了弄清楚其背后的实现原理,我查阅了一些资料,这篇文章就是针对这段时间对于注解的学习做个归纳和总结,分享出来,希望可以在一定程度上帮助到大家,文章中可能有许多不恰当甚至错误的地方,还望各位大神不吝赐教。
一、定义官方对于Java Annotation的定义如下:An annotation is a form of meta data, that can be added to Java source code.Classes,methods,variables,parameters and packages may be annotated.Annotations have no direct effect on the operation of the code they annotate.大意就是:注解是能够添加到Java源代码中的语法元数据。
Java中的类,方法,变量,参数和包都可以被注释。
注解不会对其注解的代码的操作产生直接的影响。
二、作用注解在程序中,主要有以下三点作用,不同的作用由其三种不同的保留策略(Retention Policy)决定:1.标记作用,用于告诉编辑器一些信息;2.编译时动态处理,如动态生成代码;3.运行时动态处理,如通过反射得到注解信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java注解(Annotation)(1) Annotation(注释)是JDK5.0及以后版本引入的。
它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。
注释是以‘@注释名’在代码中存在的,根据注释参数的个数,我们可以将注释分为:标记注释、单值注释、完整注释三类。
它们都不会直接影响到程序的语义,只是作为注释(标识)存在,我们可以通过反射机制编程实现对这些元数据的访问。
另外,你可以在编译时选择代码里的注释是否只存在于源代码级,或者它也能在class文件中出现。
元数据的作用如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。
基本内置注释@OverrideJava代码1. package com.iwtxokhtd.annotation;2. /**3. * 测试Override注解4. * @author Administrator5. *6. */7. public class OverrideDemoTest {8.9. //@Override10. public String tostring(){11. return "测试注释";12. }13. }package com.iwtxokhtd.annotation;/*** 测试Override注解* @author Administrator**/public class OverrideDemoTest {//@Overridepublic String tostring(){return "测试注释";}}@Deprecated的作用是对不应该在使用的方法添加注释,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能,准确的说,它还不如javadoc @deprecated,因为它不支持参数,使用@Deprecated的示例代码示例如下:Java代码1. package com.iwtxokhtd.annotation;2. /**3. * 测试Deprecated注解4. * @author Administrator5. *6. */7. public class DeprecatedDemoTest {8. public static void main(String[] args) {9. //使用DeprecatedClass里声明被过时的方法10. DeprecatedClass.DeprecatedMethod();11. }12. }13. class DeprecatedClass{14. @Deprecated15. public static void DeprecatedMethod() {16. }17. }package com.iwtxokhtd.annotation;/*** 测试Deprecated注解* @author Administrator**/public class DeprecatedDemoTest {public static void main(String[] args) {//使用DeprecatedClass里声明被过时的方法DeprecatedClass.DeprecatedMethod();}}class DeprecatedClass{@Deprecatedpublic static void DeprecatedMethod() {}}@SuppressWarnings,其参数有:deprecation,使用了过时的类或方法时的警告unchecked,执行了未检查的转换时的警告fallthrough,当Switch 程序块直接通往下一种情况而没有Break 时的警告path,在类路径、源文件路径等中有不存在的路径时的警告serial,当在可序列化的类上缺少serialVersionUID 定义时的警告finally ,任何finally 子句不能正常完成时的警告all,关于以上所有情况的警告Java代码1. package com.iwtxokhtd.annotation;2.3. import java.util.ArrayList;4. import java.util.List;5.6. public class SuppressWarningsDemoTest {7.8. public static List list=new ArrayList();9. @SuppressWarnings("unchecked")10. public void add(String data){11. list.add(data);12. }13. }package com.iwtxokhtd.annotation;import java.util.ArrayList;import java.util.List;public class SuppressWarningsDemoTest {public static List list=new ArrayList();@SuppressWarnings("unchecked")public void add(String data){list.add(data);}}(2)自定义注释它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为@interface,如下例:Java代码1. public @interface NewAnnotation {2. }public @interface NewAnnotation {}使用自定义的注释类型Java代码1. public class AnnotationTest {2. @NewAnnotation3. public static void main(String[] args) {4. }5. }public class AnnotationTest {@NewAnnotationpublic static void main(String[] args) {}}为自定义注释添加变量Java代码1. public @interface NewAnnotation {2. String value();3. }public @interface NewAnnotation {String value();}Java代码1. public class AnnotationTest {2. @NewAnnotation("main method")3. public static void main(String[] args) {4. saying();5. }6. @NewAnnotation(value = "say method")7. public static void saying() {8. }9. }public class AnnotationTest {@NewAnnotation("main method")public static void main(String[] args) {saying();}@NewAnnotation(value = "say method")public static void saying() {}}定义一个枚举类型,然后将参数设置为该枚举类型,并赋予默认值Java代码1. public @interface Greeting {2. public enum FontColor{3. BLUE,RED,GREEN4. };5. String name();6. FontColor fontColor() default FontColor.RED;}7. }public @interface Greeting {public enum FontColor{BLUE,RED,GREEN};String name();FontColor fontColor() default FontColor.RED;}}这里有两种选择,其实变数也就是在赋予默认值的参数上,我们可以选择使用该默认值,也可以重新设置一个值来替换默认值Java代码1. @NewAnnonation("main method")2. public static void main(String[] args) {3. saying();4. sayHelloWithDefaultFontColor();5. sayHelloWithRedFontColor();6.7. }8. @NewAnnonation("say method")9. public static void saying(){10.11. }12. //此时的fontColor为默认的RED13. @Greeting(name="defaultfontcolor")14. public static void sayHelloWithDefaultFontColor() {15.16. }17. //现在将fontColor改为BLUE18. @Greeting(name="notdefault",fontColor=Greeting.FontColor.BLUE)19. public static void sayHelloWithRedFontColor() {20.21. }@NewAnnonation("main method")public static void main(String[] args) {saying();sayHelloWithDefaultFontColor();sayHelloWithRedFontColor();}@NewAnnonation("say method")public static void saying(){}//此时的fontColor为默认的RED@Greeting(name="defaultfontcolor")public static void sayHelloWithDefaultFontColor() {}//现在将fontColor改为BLUE@Greeting(name="notdefault",fontColor=Greeting.FontColor.BLUE)public static void sayHelloWithRedFontColor() {}(3)注释的高级应用限制注释的使用范围用@Target指定ElementType属性Java代码1. package ng.annotation;2. public enum ElementType {3. TYPE,4. // 用于类,接口,枚举但不能是注释5. FIELD,6. // 字段上,包括枚举值7. METHOD,8. // 方法,不包括构造方法9. PARAMETER,10. // 方法的参数11. CONSTRUCTOR,12. //构造方法13. LOCAL_V ARIABLE,14. // 本地变量或catch语句15. ANNOTATION_TYPE,16. // 注释类型(无数据)17. PACKAGE18. // Java包19. }package ng.annotation;public enum ElementType {TYPE,// 用于类,接口,枚举但不能是注释FIELD,// 字段上,包括枚举值METHOD,// 方法,不包括构造方法PARAMETER,// 方法的参数CONSTRUCTOR,//构造方法LOCAL_VARIABLE,// 本地变量或catch语句ANNOTA TION_TYPE,// 注释类型(无数据)PACKAGE// Java包}注解保持性策略Java代码1. //限制注解使用范围2. @Target({ElementType.METHOD,ElementType.CONSTRUCTOR})3. public @interface Greeting {4.5. //使用枚举类型6. public enum FontColor{7. BLUE,RED,GREEN8. };9. String name();10. FontColor fontColor() default FontColor.RED;11. }//限制注解使用范围@Target({ElementType.METHOD,ElementType.CONSTRUCTOR})public @interface Greeting {//使用枚举类型public enum FontColor{BLUE,RED,GREEN};String name();FontColor fontColor() default FontColor.RED;}在Java编译器编译时,它会识别在源代码里添加的注释是否还会保留,这就是RetentionPolicy。