首页 > 代码库 > Java元注解

Java元注解

元注解的作用是负责注解其他注解。Java定义了4中标准的元注解类型,他们被用来提供对其他注解的说明。

@target

@Retention

@Documented

@Inherited

这些类型可以和他们所支持的类在Java.lang.annotation包中找到

每个元注解的作用:

@target

修饰了annotation所修饰的对象范围,annotation可被用于package,type(类,接口,枚举,annotation),和类型成员(方法,构造方法,成员变量,枚举值)、方法参数和本地变量(循环变量和catch参数)在annotation类型声明中,使用target更加清晰其修饰的目标。

作用:用于描述注解用在什么地方

取值ElementType

constructor:描述构造器

Filed:描述域

local_variable:用于描述局部变量

method:用于描述方法

package:用于描述包

parameter:用于描述参数

type:用于描述类,接口,包括注解类型或者枚举类型

使用实例:

@Target(ElementType.Type)

public @interface table{

  //数据表名称注解,默认值为类名称

  public String tableName() default “ClassName”;

}

 

@Target(ElementType.Feild)

public @interface NoDBColumn{

 

}

@Retention

@Retention定义了该annotation被保留的时间,有些annotation仅出现在源代码中,有些被编译在class文件中,编译在class文件中的annotation可能被虚拟机忽略,有些在class被装载时读取(并不影响class的运行,annotation与class在使用时是分离的)使用Retention可以的影响annotation的生命周期。

作用:表示需要在什么级别保存注释信息

retentionplicy

source:在源文件中有效

class在class文件中有效

runtime在运行时有效

retention有唯一的value作为成员,取值来自Java.lang.annotation.retationpolicy的枚举类型值

@Target(ElementType.Filed)

@Retention(RetentionPolicy.Runtime)

public @interface Column{

  public String name() default "fieldName";

  public String setFuncName() default "setFiled";

  public String getFuncName() default "getField";

  public boolean defaultDBValue() default false;

}

column注解的RetentionPolicy的属性值是Runtime,这样注解处理器可以通过反射,获取

该注解的属性值,从而做一些运行时的逻辑处理

@Documented

用于描述其他类型的annotation应该被作为被标注的程序成员的公共API,因此可以被Javadoc工具文档化,documented是一个标记注解,没有成员。

@Target(ElementType.Field)

@Retention(RetentionPolicy.RUntime)

@Documented

public @interface Column{

  public String name() default "fieldName";

  public String setFuncName() default "setField";

  public String getFunName() default "getField";

  public boolean defaultDBValue() default false;

}

@Inherited

@Inherited是一个标记注解,阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

@Inherited annotation类型是被标注过的class的子类所继承,类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

当@Inherited annotation类型标注的annotation的retention是retentionpolicy.runtime,则反射API增强了这种继承性,如果我们使用Java.lang.reflect去查询一个@Inherited annotation,代码检查将展开工作:展开class和其父类,知道发现指定的annotation。

@Inherited

public @interface Greeting{

  public enum FontColor{blue,red,green}

  String name();

  FontColor fontColor() default FontColor.green;

}

使用annotation定义注解时,自动继承了Java.lang.annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他注解或者接口。@interface用来声明一个注解,其中的每个方法表示声明一个配置参数。方法的名称是参数的名称,返回值类型是参数的类型,返回值类型只能是基本类型,class,String,enum,通过default来声明参数的默认值。

注解参数的可支持数据类型:

基本数据类型

String类型

Class类型

enum类型

annotation类型

以上所有类型的数组

annotation类型中的参数

1.只能用public或者默认default这两个访问权修饰,

如String value() 这里把方法设置为default默认类型,

2.参数成员只能用上面的类型,String value() 这里的参数成员是String

3.如果只有一个参数成员,则把参数名称设置为value,后面加小括号

 

@Target(ElementType.Field)

@Retention(RetentionPolicy.runtime)

@Documented

public @interface fruitName{

  String value() default "";

}

//水果颜色注解

@Target(ElementType.Field)

@Retention(RetentionPolicy.runtime)

@Documented

public @interface FruitColor{

  //颜色枚举

  public enum Color{Blue,RED,Green};

  //颜色属性

  Color fruitColor() default Color.green;

}

 

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("水果的名字是苹果");

}

}

注解元素必须有确定的值,要么在定义注解默认值中指定,要么在使用注解时指定,非基本类型的注解值不可为null,常常使用空字符串或者0为默认值,

 1 package annotation;
 2 
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.ElementType;
 5 import java.lang.annotation.Retention;
 6 import java.lang.annotation.RetentionPolicy;
 7 import java.lang.annotation.Target;
 8 
 9 /**
10  * 水果供应者注解
11  * @author peida
12  *
13  */
14 @Target(ElementType.FIELD)
15 @Retention(RetentionPolicy.RUNTIME)
16 @Documented
17 public @interface FruitProvider {
18     /**
19      * 供应商编号
20      * @return
21      */
22     public int id() default -1;
23     
24     /**
25      * 供应商名称
26      * @return
27      */
28     public String name() default "";
29     
30     /**
31      * 供应商地址
32      * @return
33      */
34     public String address() default "";
35 }
 
 
 
 
 
 
 
 
 
 

 

Java元注解