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个月内不可修改。