本文从此处搬运 纯属为了加强自己的记忆 点击跳转 @annotation 了解注解从从自己创造注解开始
元注解 元注解的作用就是负责注解其他注解,java5.0定义了4个meta-annotation
@Target@Retention@Documented@Inherited@Target @Target说明了annotation所修饰的对象范围 取值(ElementType)有
CONSTRUCTOR:用于描述构造器FIELD:用于描述域(类的成员变量)LOCAL_VARIABLE:用于描述局部变量METHOD:用于描述方法PACKAGE:用于描述包PARAMETER:用于描述参数TYPE:用于描述类、接口(包括注解)或enum声明@Target(ElementType.TYPE)public @interface Book{ public String BookName() default "className";}@Target(ElementType.PARAMETER)public @interface Test1{}注解book可以用来注解类、接口(包括注解)或enum声明 注解Test1只能用来注解参数 这些范围都是Target注解来确定的
@Retention @Retention 定义了该Annotation被保留的时间长短(即对该Annotation的“生命周期”进行限制) 作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即被描述的注解在什么范围内有效) 取值(RetentionPoicy)
SOURCE:在源文件中有效(即源文件保留)CLASS:在class文件中有效(即class保留)RUNTIME:在运行时保留(即运行时保留) Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。具体实例如下:@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Column{ public String name() default "fieldName"; public String setFuncName() default "setField"; public boolean defaultDBValue() default false;}Colunm注解的RetentionPolicy的属性值是RUNTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
@Documented @Documented用于描述其他类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Colum{ public String name() default "fieldName"; public String setFuncName() default "setField"; public boolean defaultDBValue() default false;}@Inherited (不是很了解) @Inherited 是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
自定义注解 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基础类型、Class、String、enum)。可以通过default来声明参数的默认值 定义注解格式: public @interface 注解名{定义体} 注解参数的可支持数据类型 所有基本数据类型 String类型 Class类型 enum类型 Annotation类型 以上所有类型的数组
Annotation类型里面的参数如何设定 第一,只能用Public或默认(default)这两个访问权修饰,例如 String value();这里把方法设为defaul默认类型; 第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class.annotation等数据类型,以及这些类的数组,例如 String value();这里的参数成员就是String; 第三,如果只有一个参数成员,最好把参数名称设为”value”,后加小括号例如:下面的FruitName注解就只有一个参数成员
import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** *水果名注解 * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitName{ String value() default "";}import java.lang.annotation.Documented;import java.lang.annotation.ElementType;impory java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** *水果颜色注解 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitColor{ /* *颜色枚举 */ public enum Color{BLUE,RED,GREEN}; /* *颜色属性 */ Color fruitColor() default Color.GREEN;import annotation.FruitColor.Color;public class Apple{ @FruitName("Apple") PRivate String appleName; @FruitColor(fruitColor=Color.RED) private String appleColor; public void setAppleColor(String appleColor){ this.appleColor=appleColor; } public String getAppleColor(){ return appleColor; } public void setAppleName(String appleName){ this.appleName=appleName; } public String getAppleName(){ return appleName; } public void displayName(){ System.out.println("水果的名字是:苹果"); }}新闻热点
疑难解答