注解
概念
- 注解Annotation是JAVA提供的一种
对元程序中的元素关联信息和元数据(metadata)的途径和方法
。 - 注解Annotation是一个接口,程序可以
通过反射来获取指定程序中元素的Annotation对象
,然后通过该Annotation对象获取注解中的元数据信息。
标准元注解
- 元注解:负责注解其他注解。
- Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它annotation类型作说明。
@Target
修饰对象范围
作用 | 作用域声明 |
---|
FIELD | 字段声明 |
CONSTRUCTOR | 构造方法声明 |
LOCAL VARIABLE | 局部变量声明 |
METHOD | 方法声明 |
PACKAGE | 包声明 |
PARAMETER | 参数声明 |
TYPE | 类接口 |
生命周期 | 周期说明 |
---|
SOURCE | 只在源码显示,编译时丢弃 |
CLASS | 编译时记录到class中,运行时忽略 |
RUNTIME | 运行时存在,可以通过反射读取 |
@Documented
描述-javadoc
- @Documented用于描述其他类型的annotation应该被作为被标注的程序成员的公共API。
@Inherited
阐述某个被标注的类是被继承的
- @Inherited元注解是一个标记注解。
- 如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注解的属性(成员变量)
- 注解
只有成员变量
,没有方法。 - 注解的成员变量在注解的定义中
以“无形参的方法”形式来声明
,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。
示例:
/**
* 定义注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
/**供应商编号 */
public int id() default -1;
public String name() default "";
public String address() default "";
}
public class Apple {
@FruitProvider(id = 1, name = "陕西红富士集团", address = "陕西省西安市延安路")
private String appleProvider;
public String getAppleProvider() {
return appleProvider;
}
public void setAppleProvider(String appleProvider) {
this.appleProvider = appleProvider;
}
}
- 使用@interface自定义注解时,
自动继承java.lang.annotation.Annotation接口
,由编译程序字段完成其他细节。在定义注解时,不能继承其他注解或接口。 - @interface用来声明一个注解,其中的每一个方法都声明了一个属性,返回值类型是参数的类型。
- Annotation类型参数设定:
- 只能用
public或默认(default)修饰
- 参数成员只能用
基本类型、String、Enum、Class、annotaions等数据类型以及这些类型的数组
。 - 如果只有一个参数成员,最好把参数名称设置为“value”后加小括号。
JAVA预置注解
- @Deprecated:标记过时的元素(方法、类或成员变量)
- @Override:子类要复写父类中修饰的方法
- @SuppressWarnings:阻止警告
- @SafeVarargs:参数安全类型注解
- @FunctionalInterface:
函数式接口注解
。线程开发中常用的Runnable 就是一个典型的函数式接口
,源码可以看到它就被 @FunctionalInterface 注解。
注解处理器
Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器
。
FruitProvider 、Apple 类在上文中public class FruitInfoUtil {
public static void getFruitInfo(Class <?> clazz){
String strFruitProvider = "供应商信息:";
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields){
if (field.isAnnotationPresent(FruitProvider.class)){
FruitProvider fruitProvider = field.getAnnotation(FruitProvider.class);
strFruitProvider = "供应商编号:" + fruitProvider.id() +" 供应商名称:" +
fruitProvider.name() + " 供应商地址:" + fruitProvider.address();
System.out.println(strFruitProvider);
}
}
}
}
public class FruitRun {
public static void main(String[] args){
FruitInfoUtil.getFruitInfo(Apple.class);
}
}
运行结果:供应商编号:1 供应商名称:陕西红富士集团 供应商地址:陕西省西安市延安路
注解与反射