为了账号安全,请及时绑定邮箱和手机立即绑定

java注解@Interface与Annotation

java注解@Interface与Annotation

小怪兽爱吃肉 2019-03-13 14:15:55
@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Component {    String value() default "";}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Configuration {   String value() default "";}我有一个对象被@Configuration注解,那我怎么知道它还是被Component注解的?@Interface 和接口Annotation是什么关系?有一个注解了@Configuration的对象, obj.getClass().getAnnotation(Configuration.class).getClass()==Configu‌ration.class 结果是false, obj.getClass().getAnnotation(Configuration.class) instanceof Configuration为true, obj.getClass().getAnnotation(Configuration.class) instanceof Component为false
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

  1. Annotation 也可以获取自身的注解。

  2. @interface 是声明注解的关键字(与class/interface一样)

  3. obj.getClass().getAnnotation(Configuration.class).getClass() == Configu‌ration.class 引用不同结果为false是正常情况。可以使用这种判断obj.getClass().getAnnotation(Configuration.class).getClass().getName().equals(Configu‌ration.class.getName())

  4. @Component只是@Configuration 的注解声明,并不表示@Configuration就是@Component类型

另外上面这种用法叫Meta-Annotations在 spring-4.1.x 之后的的版本都支持这个功能,可以自定义Annotation,声明Meta-Annotations即可拥有相对的功能。
beans-meta-annotations
Spring Annotation Programming Model

@ContextConfiguration

public @interface MyTestConfig {


    @AliasFor(annotation = ContextConfiguration.class, attribute = "value")

    String[] xmlFiles();


    // ...

}

注:Meta-Annotations并不是Annotation的原生功能,只是在spring中实现了这种机制。如果单纯的使用原生的Annotation则需要自己解析Meta-Annotations实现相应的功能才行。


查看完整回答
反对 回复 2019-04-25
?
守候你守候我

TA贡献1802条经验 获得超10个赞

我有一个对象被@Configuration注解,那我怎么知道它还是被Component注解的?


@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component  //<-这不是明摆着吗

public @interface Configuration {

   String value() default "";

}

  1. @Interface 和接口Annotation是什么关系?

    • 没听懂

  2. 讲道理getAnnotation(xx)以后直接去判断应该就可以了吧


查看完整回答
反对 回复 2019-04-25
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

  1. 楼上已经说过了,就不赘述了。

  2. 在 Annotation 的注释中第一句话就是: The common interface extended by all annotation types.

    即所有的注解类本质上都是继承了 `Annotation` 的接口。
  3. xx.getAnnotation(AnnotationClass) 这种做法取出来的不是注释类实例,而是一个 Proxy 实例,所以它的class != AnnotationClass
    @Component注解只是声明了 @Configuration 这个注解本身,并不意味着后者继承了前者,所以结合2,只有 class instanceof Annotation -> true


查看完整回答
反对 回复 2019-04-25
  • 3 回答
  • 0 关注
  • 821 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信