java自定义注解

举报
bella zh 发表于 2020/02/24 21:28:09 2020/02/24
【摘要】 元注解可以修改其他注解的注解。Java标准库定义了一些元注解,如@Target,@Retention,@Inherit等。@Target用于描述注解的使用范围,其取值范围有:CONSTRUCTOR: 用于描述构造器;FIELD:用于描述域;LOCAL_VARIABLE: 用于描述局部变量;METHOD: 用于描述方法;PACKAGE: 用于描述包;PARAMETER: 用于描述参数;TYPE...
  1. 元注解可以修改其他注解的注解。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();
       }
    }
 }


 

spacer.gif

 


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。