@Annotation的参数问题

问题描述:

在工作学习中经常用到注解,@Component,@Resource,@Override等等。有时候会在注解中带上参数如@ComponentScan("com.newyear.test"),有时候会显式写出@Resource(name="prettyCat")。

问题是--什么时候可以省略参数名,省略参数名时这个参数传给了注解的什么属性?

猜测:

1 注解的属性仅有一个没有默认值
2 注解的第一个属性

预备知识——注解的属性:

注解通过 @interface关键字进行定义

public @interface TestAnnotation {}
如上的代码定义了一个名为TestAnnotation的注解。

带有属性的注解:

@interface Ghost{
	int HP() default 10;
	double aggressivity();
}

注解中的HP(),aggressivity()就是注解的属性,其中HP带有默认值。--使用注解必须给每一个属性赋值

 

测试推理

@Annotation的参数问题_第1张图片

如上图,测试注解定义了三个域。分别为c,vlue,name

现在在使用它的时候传入参数”xx”,本来以为会默认对应到没有default值的域,结果报错说未定义value

 

我们把int vlue()改成int value()

@Annotation的参数问题_第2张图片

新的错误是”xx”不能被转换成int类型

由于value()并非注解中第一个域,所以参数也不是按顺序匹配的

 

我们直接把”xx”去掉

@Annotation的参数问题_第3张图片 点击quick fix

 

结论与验证

使用注解时必须给它的所有参数赋值。当且仅当域名为value且不存在其他无默认值的域时可以使用@Annotation(value)形式

 

Q:@ComponentScan(”com.homework.learnnotes. *”)注解的参数传递给了哪一个?

A:必定是@ComponentScan定义中名为value的参数

@Annotation的参数问题_第4张图片即basePackages

 

再看看@Autowired

@Annotation的参数问题_第5张图片@Annotation的参数问题_第6张图片

 

jls13  9.6   https://docs.oracle.com/javase/specs/jls/se13/jls13.pdf

The return type of a method declared in an annotation type must be one of the following, or a compile-time error occurs:

• A primitive type     //基本类型 

• String

• Class or an invocation of Class (§4.5)

• An enum type

• An annotation type

• An array type whose component type is one of the preceding types (§10.1).

By convention, the name of the sole element in a single-element annotation type is value.

按照约定,单个元素注释类型中唯一元素的名称为value。

<英语不好,jls太多了,不想细看>

 

 

 

 

 

 

 

 

你可能感兴趣的:(Java基础)