自定义注解:
1.成员类型是受限的,合法的类型包括原始类型及String,Calss,Anootation,Enumreation
2.如果注解只有一个成员,则成员名必须取名为Value(),在使用的时可以忽略成员名和赋值号(=)
3.没有成员的注解称为标识注解
public @interface Description{//使用@interface关键字注解
String name();//成员以无参无异常方式声明
String author();
int age() default 19;//可以用default为成员变量指定一个默认值
}
元注解br/>@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD})
// Target 注解的作用域 CONSTRUCTOR 构造方法声明,FIELD 字段声明,LOCAL_VARIABLE 局部变量声明 ,METHOD 方法声明,PACKAGE 包声明,PARAMETER 参数声明,TYPE 类接口。br/>@Retention(RetentionPolicy.RUNTIME)
//Retention 生命周期——SOURCE 只在源码显示,编译时会丢弃;CLASS 编译时会记录到class中,运行时忽略;RUNTIME 运行时存在,可以通过反射读取。br/>@Inherited
//Inherited 允许子类继承br/>@Documented
//Documented 生成javadoc的时候包含注解
下面以一个demo演示解析注解
package com.description.demo;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注解的作用域
@Target({ElementType.METHOD,ElementType.TYPE})
//注解的生命周期
@Retention(RetentionPolicy.RUNTIME)
//注解是否允许被继承
@Inherited
//是否生成注解Javadoc文档子注解
@Documented
public @interface Description {
String desc();
String auth()default"rongrong";
}
接口
package com.description.demo;
public interface Person {
String name();
int age();
void say();
}
实现类
package com.description.demo;
@Description(desc = "class annotation")
public class Child implements Person {
@Override
@Description(desc = "method annotation")
public String name() {
// TODO Auto-generated method stub
return null;
}
@Override
public int age() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void say() {
// TODO Auto-generated method stub
}
}
测试类:
/**
*
*/
package com.description.demo;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import org.junit.Test;
/**
* @author Administrator
* 解析注解
*/
public class MainTest {
@SuppressWarnings("unchecked")
@Test
public void run(){
try {
// 通过反射加载实体类
Class c = Class.forName("com.description.demo.Child");
// 找到类上面的注解
boolean isExist= c.isAnnotationPresent(Description.class);
if (isExist) {
// 拿到实体类,一定强转为注解类型,反则找不到
Description d = (Description) c.getAnnotation(Description.class);
System.out.println(d.desc());
}
// 找到方法上的注解
Method[] method = c.getMethods();
for (Method ms : method) {
isExist = ms.isAnnotationPresent(Description.class);
if (isExist) {
Description d = ms.getAnnotation(Description.class);
System.out.println(d.desc());
}
// 另一种方法
Annotation[] annotation = ms.getAnnotations();
for (Annotation as : annotation) {
if (as instanceof Description) {
String desc = ((Description) as).desc();
System.out.println(desc);
}
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
EOF
本文作者:久曲建的测试窝
本文链接:https://www.cnblogs.com/longronglang/p/6376183.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
优秀不够,你是否无可替代
软件测试交流QQ群:721256703,期待你的加入!!
欢迎关注我的微信公众号:软件测试君
原文:https://blog.51cto.com/15009374/2557547