一、注解(Annotation)的简介:
注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
二、注解的分类:
1、一般常用的注解可以分为三类:
一类是Java自带的标准注解,包括@Override(标明重写某个方法)、@Deprecated(标明某个类或方法过时)和@SuppressWarnings(标明要忽略的警告),使用这些注解后编译器就会进行检查。
一类为元注解,元注解是用于定义注解的注解,包括@Retention(标明注解被保留的阶段)、@Target(标明注解使用的范围)、@Inherited(标明注解可继承)、@Documented(标明是否生成javadoc文档)
一类为自定义注解,可以根据自己的需求定义注解
2、注解基本元素解析(@RequiresPermissions 注解为例)
声明一个注解要用到的:
● 修饰符
访问修饰符必须为public,不写默认为pubic;
● 关键字
关键字为@interface;
● 注解名称
注解名称为自定义注解的名称,使用时还会用到;
● 注解类型元素
注解类型元素是注解中内容,可以理解成自定义接口的实现部分;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
String[] value();
Logical logical() default Logical.AND;
}
@Target
表明该注解可以应用的java元素类型
Target类型 |
描述 |
ElementType.TYPE |
应用于类、接口(包括注解类型)、枚举、或enum声明 |
ElementType.FIELD |
应用于类中的成员变量(包括枚举中的常量) |
ElementType.METHOD |
应用于方法 |
ElementType.PARAMETER |
应用于方法的形参 |
ElementType.CONSTRUCTOR |
应用于构造函数 |
ElementType.LOCAL_VARIABLE |
应用于局部变量 |
ElementType.ANNOTATION_TYPE |
应用于注解类型 |
ElementType.PACKAGE |
应用于包 |
ElementType.TYPE_PARAMETER |
JDK1.8版本新增,应用于类型变量) |
ElementType.TYPE_USE |
JDK1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型) |
@Retention
表明该注解的生命周期
生命周期类型 |
描述 |
RetentionPolicy.SOURCE |
编译时被丢弃,不包含在类文件中(即源文件保留 ) |
RetentionPolicy.CLASS |
JVM加载时被丢弃,包含在类文件中,默认值(即class保留 ) |
RetentionPolicy.RUNTIME |
由JVM 加载,包含在类文件中,在运行时可以被获取到(即运行时保留 ) |
@Document
表明该注解标记的元素可以被Javadoc 或类似的工具文档化
@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解
三、自定义注解格式:
public @interface 注解名 {定义体}
注解参数的可支持数据类型:
1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。
3.1 自定义注解:@FileName
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.PARAMETER})//成员变量
@Retention(RetentionPolicy.RUNTIME)//运行时
@Documented
public @interface FileName {
String value() default "";
String description();
}
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class FileNameTest {
@FieldName(value = "张三", description = "用户姓名")
private String userName;
@Test
public void contextLoads() {
log.info("hello test");
}
@Test
public void testAnotation() {
log.info("start ...");
//获取测试类的模版
Class nameClass = FileNameTest.class;
//获取 所有的字段
for (Field f : nameClass.getDeclaredFields()) {
//判断此字段是否有FileName注解
if (f.isAnnotationPresent(FieldName.class)) {
FieldName fAnnotation = f.getAnnotation(FieldName.class);
log.info("字段:[" + f.getName() + "], 值:[" + fAnnotation.value() + "], 描述:[" + fAnnotation.description() + "]");
}
}
}
}
文章来源: 微信公众 -> IT专刊 -> Java自定义注解
来源:oschina
链接:https://my.oschina.net/u/4339481/blog/4273373