Java元注解
Posted 夏日的微笑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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元注解的主要内容,如果未能解决你的问题,请参考以下文章