Java自定义注解

本文深入探讨Java注解的使用及自定义方式,包括内置注解如@Override、@Deprecated和@SuppressWarnings的功能,以及元注解@Retention、@Documented、@Target和@Inherited的作用和应用场景。

自定义注解

内置注解

  • @Override 检查改方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
  • @Deprecated 标记过时方法。如果使用该方法,会报编译警告。
  • @SuppressWarnings 指示编译器去忽略注解中声明的警告。

元注解(作用在其他注解的注解)

  • @Retention- 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。

    • Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源码(编译期),字节码(类加载)或者运行期(JVM中运行)。在@Retention注解中使用枚举RetentionPolicy来表示注解保留时期
    • @Retention(RetentionPolicy.SOURCE),注解仅存在于源码中,在class字节码文件中不包含
    • @Retention(RetentionPolicy.CLASS), 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
    • @Retention(RetentionPolicy.RUNTIME), 注解会在class字节码文件中存在,在运行时可以通过反射获取到
    • 如果我们是自定义注解,则通过前面分析,我们自定义注解如果只存着源码中或者字节码文件中就无法发挥作用,而在运行期间能获取到注解才能实现我们目的,所以自定义注解中肯定是使用 @Retention(RetentionPolicy.RUNTIME)
  • @Documented- 标记这些注解是否包含在用户文档中。

    • Document的英文意思是文档。它的作用是能够将注解中的元素包含到 Javadoc 中去。
  • @Target - 标记这个注解应该是哪种 Java 成员。

    • Target的英文意思是目标,这也很容易理解,使用@Target元注解表示我们的注解作用的范围就比较具体了,可以是类,方法,方法参数变量等,同样也是通过枚举类ElementType表达作用类
    • @Target(ElementType.TYPE) 作用接口、类、枚举、注解
    • @Target(ElementType.FIELD) 作用属性字段、枚举的常量
    • @Target(ElementType.METHOD) 作用方法
    • @Target(ElementType.PARAMETER) 作用方法参数
    • @Target(ElementType.CONSTRUCTOR) 作用构造函数
    • @Target(ElementType.LOCAL_VARIABLE)作用局部变量
    • @Target(ElementType.ANNOTATION_TYPE)作用于注解(@Retention注解中就使用该属性)
    • @Target(ElementType.PACKAGE) 作用于包
    • @Target(ElementType.TYPE_PARAMETER) 作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8加入)
    • @Target(ElementType.TYPE_USE) 类型使用.可以用于标注任意类型除了 class (jdk1.8加入)
    • 一般比较常用的是ElementType.TYPE类型
  • @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)

    • Inherited的英文意思是继承,但是这个继承和我们平时理解的继承大同小异,一个被@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。

    •  
      1. /**自定义注解*/
      2. @Documented
      3. @Inherited
      4. @Retention(RetentionPolicy.RUNTIME)
      5. @Target(ElementType.TYPE)
      6. public @interface MyTestAnnotation {
      7. }
      8. /**父类标注自定义注解*/
      9. @MyTestAnnotation
      10. public class Father {
      11. }
      12. /**子类*/
      13. public class Son extends Father {
      14. }
      15. /**测试子类获取父类自定义注解*/
      16. public class test {
      17. public static void main(String[] args){
      18.  
      19. //获取Son的class对象
      20. Class<Son> sonClass = Son.class;
      21. // 获取Son类上的注解MyTestAnnotation可以执行成功
      22. MyTestAnnotation annotation = sonClass.getAnnotation(MyTestAnnotation.class);
      23. }
      24. }

例子

 
  1. package com.trip.reflect;
  2.  
  3. import java.lang.annotation.*;
  4.  
  5. @Documented
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @Target(ElementType.METHOD)
  8. public @interface HasRoles {
  9. String[] roles() default {};
  10. }

反射获取该注解

 
  1. public class Demo01 {
  2.  
  3. @HasRoles(roles = {"all"})
  4. public void test1(){
  5. System.out.println("123");
  6. }
  7.  
  8. public static void main(String[] args) throws NoSuchMethodException {
  9. Class<Demo01> aClass = Demo01.class;
  10. HasRoles annotation = aClass.getMethod("test1", null).getAnnotation(HasRoles.class);
  11. String[] roles = annotation.roles();
  12. for (String role : roles) {
  13. System.out.println(role);
  14. }
  15. }
  16. }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值