查看代码的时候发现了一个annotation类型的文件,好奇百度了一下,又有新技能get。以前我了解的java注解,就是用//等符号标注的注释,或者@author,再或者,就是最近接触的testng框架注释。
今天看到的代码如下:
package com.api.common;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.CONSTRUCTOR})
public @interface DBUnitScript {
public String value();
public String dataSourceName();
}
文件类型为annotation,即注解。这是一个自定义的注解(Annotation)类,即DBUnitScript, 在定义注解(Annotation)类时使用了另一个注解类Retention。
*在注解类上使用另一个注解类,那么被使用的注解类就称为元注解。
新建注解类
新建一个class,在kind中选择annotation类型文件,即可新建一个注解类。
以下部分内容摘抄自孤傲苍狼,侵删。原帖地址:http://www.cnblogs.com/xdp-gacl/p/3622275.html
注解就相当于一个你的源程序要调用一个类,在源程序中应用某个注解,得事先准备好这个注解类。就像你要调用某个类,得事先开发好这个类。
java中元注解有四个: @Retention @Target @Document @Inherited
1、Retention注解决定注解的生命周期
1、@Retention()
这里是在注解类DBUnitScript上使用另一个注解类即Retention注解,这里的Retention称为元注解。
2、@Retention(RetentionPolicy.SOURCE)
这个注解的意思是让DBUnitScript注解只在java源文件中存在,编译成.class文件后注解就不存在了
3、@Retention(RetentionPolicy.CLASS)
这个注解的意思是让DBUnitScript注解在java源文件(.java文件)中存在,编译成.class文件后注解也还存在,
4、 @Retention(RetentionPolicy.RUNTIME)
意思是让DBUnitScript这个注解的生命周期一直程序运行时都存在
5、被DBUnitScript注解类标识的类被类加载器加载到内存中后MyAnnotation注解就不存在了
@Retention元注解的讲解:其三种取值:RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME分别对应:Java源文件(.java文件)---->.class文件---->内存中的字节码
2、Target注解
Target注解决定注解可以加在哪些成分上,如加在类身上,或者属性身上,或者方法身上等成分,@Target默认值为任何元素(成分)
如:
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.CONSTRUCTOR})
@Target:注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
3、@Document:说明该注解将被包含在javadoc中
4、 @Inherited:说明子类可以继承父类中的该注解
为注解添加属性
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.CONSTRUCTOR})
public @interface DBUnitScript {
//属性
public String value();//数据脚本地址
public String dataSourceName();
}
把自定义的注解类加到某个类上
@ DBUnitScript
public class AnnotationUse{
}
应用属性
@DBUnitScript(value = "sql/addCustomAccountTitles.sql", dataSourceName = "dataSource")
//在执行方法前先调用DBUnitScript注解
public void testCustomerAccountTitles(SelectItem[] cols, Object[] data) throws Exception{
String api = "";//请求api
Map<String, String> params = new HashMap<>();
params.put("pId", data[2].toString());
Response response = request(api, HttpMethod.POST, params);
}