@target(elementtype.constructor)表示该注解仅能用于构造函数,定义时直接指定该元素;若需多目标则用数组形式,如{elementtype.constructor, elementtype.method};通常搭配@retention(retentionpolicy.runtime)以便运行时反射获取。

@Target(ElementType.CONSTRUCTOR) 表示该自定义注解**只能标注在构造函数上**,其他位置(如类、方法、字段)使用会编译报错。
怎么配置 ElementType.CONSTRUCTOR
在定义自定义注解时,直接在 @Target 中指定 ElementType.CONSTRUCTOR 即可:
- 单个目标:@Target(ElementType.CONSTRUCTOR)
- 多个目标(比如也允许用在方法上):@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
实际写法示例
下面是一个只允许用于构造函数的注解定义:
@Target(ElementType.CONSTRUCTOR)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogConstructor {
String value() default "constructor logged";
}
这样定义后,只能这么用:
public class UserService {
@LogConstructor("init with name")
public UserService(String name) {
// ...
}
}
如果误标在方法或字段上,比如:
@LogConstructor // 编译错误!
public void doSomething() { ... }
编译器会立即提示:"Annotation '@LogConstructor' is not applicable to this kind of declaration"。
配合 @Retention 的常见搭配
构造函数上的注解通常需要运行时读取(比如 AOP 或反射初始化时做日志/校验),所以建议搭配 RetentionPolicy.RUNTIME:
- 用
@Retention(RetentionPolicy.SOURCE):注解只存在于源码,编译后就没了,无法在反射中获取 - 用
@Retention(RetentionPolicy.CLASS):保留在 .class 文件里,但 JVM 不加载,反射也拿不到 - 用
@Retention(RetentionPolicy.RUNTIME):可在运行时通过Constructor.getAnnotation()获取,最常用
如何在代码中读取构造函数上的注解
利用反射获取带注解的构造函数:
Constructor<userservice> ctor = UserService.class.getConstructor(String.class);
LogConstructor annotation = ctor.getAnnotation(LogConstructor.class);
if (annotation != null) {
System.out.println(annotation.value()); // 输出 "constructor logged" 或自定义值
}</userservice>
注意:必须确保类加载时构造函数确实存在且可见(public / protected),否则可能抛出 NoSuchMethodException。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











