美文网首页
自定义注解与提取注解学习

自定义注解与提取注解学习

作者: 走在冷风中吧 | 来源:发表于2017-09-13 14:25 被阅读75次

上一篇: java 注解学习
上篇文章中学习了系统内置注解与元注解(@Retention, @Target, @Inherited, @Document), 元注解可帮助我们进行一些自定义注解, 接下来我们学习如何自定义注解.

定义自定义注解

自定义注解与定义接口很相似, 只是将 interface换成@interface即可.

  • 不带参数的注解(又称标记注解)
public @interface MyFirstAnnotation {
}
如果自定义注解上没有添加元注解, 则默认该注解可以用于类,接口,方法等
  • 带参数的注解(又称元数据注解, 为注解提供数据元素)
public @interface MyFirstParamAnnotation {
    String value();
}
参数可以有一个或者多个, 一个的情况下一般参数名都为 value(因为涉及到注解取值时候的简写, 默认习惯而已) 
  • 有元注解修饰的注解类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyFirstParamAnnotation {
    String value();
}
@Retention 为运行时可见, 可以使用反射获取注解
@Target 表示该注解为类注解, 指定了注解的修饰位置

自定义注解的使用

自定义注解的使用很简单, 根据定义好的注解以及需求, 在需要使用注解的上@+注解名

@MyFirstParamAnnotation("user")
public class User {
    
}

然鹅, 这样使用没有什么实质性的作用, 因为没有对注解进行提取, 所有在代码效果上添加注解并不作用, 接下来我们学习如何提取注解,使自定义注解变得有意义.

提取自定义注解

自定义注解的提取主要依靠的是AnnotatedElement 类,位于java.lang.reflect下,
以下为源码:

public interface AnnotatedElement {
    default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
        throw new RuntimeException("Stub!");
    }

    <T extends Annotation> T getAnnotation(Class<T> var1);

    Annotation[] getAnnotations();

    Annotation[] getDeclaredAnnotations();

    default <T extends Annotation> Annotation getDeclaredAnnotation(Class<T> annotationClass) {
        throw new RuntimeException("Stub!");
    }

    default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) {
        throw new RuntimeException("Stub!");
    }

    default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
        throw new RuntimeException("Stub!");
    }
}

从源码中我们能看到这么几个方法,isAnnotationPresent , getAnnotation , getAnnotations , getDeclaredAnnotations 使我们提取注解的关键方法

方法名 参数 返回值 作用
isAnnotationPresent annotationClass 布尔值 检测该元素是否被这个注解类注解过
getAnnotation annotationClass 注解类 获得这个注解类对应的注解对象
getAnnotations 所有的注解类 获得该元素上的所有注解类数组, 没有的话返回长度为0的数组
getDeclaredAnnotations 所有的注解类 同上, 但是返回的数组中不包括继承的注解

很多强大的第三方数据库都是通过注解的方式实现的,现在我们举一个简单的例子去提取注解

Table.class 定义好注解类

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {
    String value();
}

在ORM中一般把表映射为实体类,所以表注解的修饰类型这里设为ElementType.TYPE代表可修饰类类型

user.class 使用注解类Table修饰

@Table("user")
public class User {
    private String name;
}

提取注解:

.....

    public void getAnnotation(){
        User user = new User();
        if (user.getClass().isAnnotationPresent(Table.class)){
            Table table = user.getClass().getAnnotation(Table.class);
            String value = table.value();
            System.out.print("table's value is " + value);
        }
    }
.....
输出结果为 table's value is user

本文为自己的学习笔记, 很多地方可能写的不是很对, 作为学习成果保存下来, 日后发现不足的地方会进行及时更新!~
END...

相关文章

  • 自定义注解与提取注解学习

    上一篇: java 注解学习上篇文章中学习了系统内置注解与元注解(@Retention, @Target, @In...

  • Java注解学习总结(脑图)

    注解的提取测试:定义注解: 测试注解提取: 参考:《Java编程思想》java注解

  • java基础之自定义注解

    注解Annotation实现原理与自定义注解例子

  • Java Excel (Apache POI + annotat

    思路: 自定义注解, 导出/读取 excel 根据注解自动解析字段 注解 注解与excel mapping 工厂,...

  • 注解

    主要学习自定义注解: 注解:对程序的标注和解释 比如Override 1 如果自定义一个注解,注解的里面的属性又如...

  • 注解学习笔记

    什么是注解注解分类注解作用分类 元注解 Java内置注解 自定义注解自定义注解实现及使用编译时注解注解处理器注解处...

  • Java注解与Spring注解

    1,元注解与自定义注解 1)java.lang.annotation包中包含了所有定义自定义注解所需要的元注解和接...

  • 注解与反射

    注解与反射 自定义注解 @Target 描述的注解可以用在什么地方@Retention 表示被它所注解的注解在...

  • java注解与反射,泛型与反射

    一、反射与注解 内置注解 java内置了3种注解,用来为编译器提供检查。 自定义注解 元注解 元注解是用来修饰注解...

  • 【JAVA】注解

    元注解 用来定义、声明注解的注解。 @Inherited注解 使用此注解声明出来的自定义注解,在使用此自定义注解时...

网友评论

      本文标题:自定义注解与提取注解学习

      本文链接:https://www.haomeiwen.com/subject/izeksxtx.html