java自定义注解
【摘要】 元注解可以修改其他注解的注解。Java标准库定义了一些元注解,如@Target,@Retention,@Inherit等。@Target用于描述注解的使用范围,其取值范围有:CONSTRUCTOR: 用于描述构造器;FIELD:用于描述域;LOCAL_VARIABLE: 用于描述局部变量;METHOD: 用于描述方法;PACKAGE: 用于描述包;PARAMETER: 用于描述参数;TYPE...
元注解可以修改其他注解的注解。Java标准库定义了一些元注解,如@Target,@Retention,@Inherit等。
@Target
用于描述注解的使用范围,其取值范围有:
CONSTRUCTOR: 用于描述构造器;
FIELD:用于描述域;
LOCAL_VARIABLE: 用于描述局部变量;
METHOD: 用于描述方法;
PACKAGE: 用于描述包;
PARAMETER: 用于描述参数;
TYPE: 用于描述类、接口(包括注解类型) 或enum声明;
@Retention
用于描述注解的生命周期,其取值范围有:
SOURCE: 在源文件中有效(即源文件保留);
CLASS: 在class文件中有效(即class保留);
RUNTIME: 在运行时有效(即运行时保留);
@Inherited
定义子类是否可以继承父类定义的注解,仅对@Target(ElementType.TYPE)类型的注解有效,并且是针对class的继承,对interface无效。
2. 自定义注解步骤:
第一步,用@interface定义注解:
public @interface Report {
}
第二步,添加参数、默认值:
public @interface Report {
int type() default 0;
String level() default "info";
String value() default "";
}
把最常用的参数定义为value(),推荐所有参数都尽量设置默认值。
第三步,用元注解配置注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Report {
int type() default 0;
String level() default "info";
String value() default "";
}
3.示例1
定义注解
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target(ElementType.FIELD)
public @interface Name {
public String value() default "zz";
}
在field上使用注解
public class AdultPerson{
@Name("zyc")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
获取注解的值
public class CustomUtils {
public static void getInfo(Class<?> clazz) {
Field fields[] = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(Name.class)) {
Name arg0 = field.getAnnotation(Name.class);
String name = arg0.value();
System.out.println(name);
}
}
}
}
打印注解的值
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
CustomUtils.getInfo(AdultPerson.class);
}
}
4.示例2
定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface HelloWord {
public String name() default "zz";
}
在方法上使用注解
public class SayHelloWorld {
@HelloWord(name = "zyc")
public void sayHelloWorld(String name) {
System.out.println(name + " " + "say hello world");
}
}
解析注解的值
public static void parseMethod(Class clazz) throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException{
Object obj = clazz.getConstructor(new Class[]{}).newInstance(new Object[]{});
for(Method method : clazz.getDeclaredMethods()) {
HelloWord say = method.getAnnotation(HelloWord.class);
if(say != null) {
String name = say.name();
method.invoke(obj, name);
}
}
}
打印注解的值
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
CustomUtils.getInfo(AdultPerson.class);
try {
CustomUtils.parseMethod(SayHelloWorld.class);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)