前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >总说自定义注解,可是自定义注解到底该怎么用?

总说自定义注解,可是自定义注解到底该怎么用?

作者头像
我的小熊不见了丶
发布2019-05-22 21:40:45
1.1K0
发布2019-05-22 21:40:45
举报
文章被收录于专栏:晓月寒·晓月寒·

在项目中新建Java文件是选择Annotation类型则会为我们创建一个注解文件。关于注解的详细介绍可以看之前写的注解详解文章。

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Scope("prototype")
public @interface XyhBean {
}

上面创建的这个注解表名这是一个在运行时起作用的注解,并且只能作用于类上,而且作用的类不是一个单例。

使用场景

在我们的项目中可能会遇到这样的情况,需要一个工厂或者Map来存储一些类的信息,在之后的使用过程中通过工厂或者Map来获取到我们所需要的类。在一般情况下我们可能就会使用Map来进行这个操作。但是每当项目中新增一个类就要往Map中也操作一次,这样会非常的麻烦并且容易出现问题,因此我们使用自定义注解通过spring来帮我们操作。

ApplicationListener

在一些业务场景中,当容器初始化完成之后,需要处理一些操作,比如一些数据的加载、初始化缓存、特定任务的注册等等。这个时候我们就可以使用Spring提供的ApplicationListener来进行操作。

代码语言:javascript
复制
@Component
public class ContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {
    public static Map<String, Object> beanMap = new HashMap<>();

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        beanMap = event.getApplicationContext().getBeansWithAnnotation(XyhBean.class);
    }
}

项目启动之后,读取所有注解了XyhBean注解的类放进我们事先定义好的Map中。

通过反射处理注解

上面的方法是通过Spring来帮助我们实现了一个简单的自定义注解场景,如果有更加复杂的场景的话就需要借助Java的反射来完成了。

注解处理器类库(java.lang.reflect.AnnotatedElement):

Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口。除此之外,Java在java.lang.reflect 包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素,该接口主要有如下几个实现类:

  • Class:类定义
  • Constructor:构造器定义
  • Field:累的成员变量定义
  • Method:类的方法定义
  • Package:类的包定义

java.lang.reflect 包下主要包含一些实现反射功能的工具类,实际上,java.lang.reflect 包所有提供的反射API扩充了读取运行时Annotation信息的能力。当一个Annotation类型被定义为运行时的Annotation后,该注解才能是运行时可见,当class文件被装载时被保存在class文件中的Annotation才会被虚拟机读取。

AnnotatedElement 接口是所有程序元素(Class、Method和Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息: 方法1. <T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回该程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。 方法2. Annotation[] getAnnotations():返回该程序元素上存在的所有注解。 方法3. boolean is AnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false. 方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

代码语言:javascript
复制
public class AnnotationUtil {
    public static boolean getFruitInfo(Class<?> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(XyhBean.class)) {
                return true;
            }
        }
        return false;
    }
}

以上代码可以用来判断传进来的类是否注解了我们自己定义的注解。具体使用的方法需要根据使用场景来进行选择。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.02.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用场景
  • ApplicationListener
  • 通过反射处理注解
    • 注解处理器类库(java.lang.reflect.AnnotatedElement):
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档