在自定义注解上使用@Target(ElementType.METHOD)可限定其仅能用于方法,配合@Retention(RetentionPolicy.RUNTIME)确保运行时可通过反射获取;错误写法如数组单元素、拼写错误等会导致编译失败。

直接在自定义注解上加 @Target(ElementType.METHOD) 就行,这是最常用也最明确的写法。
只允许用在方法上
这样配置后,编译器会强制校验:如果把该注解加到类、字段、参数等其他位置,就会报错。
- 写法简洁清晰,语义明确
- IDE 和编译器能实时提示错误,避免误用
- 符合 Spring 等主流框架对行为型注解(如日志、权限、事务)的惯用约定
常见搭配组合
大多数运行时生效的方法级注解还会配合 @Retention(RetentionPolicy.RUNTIME),确保反射能读取到。
- 比如切面类通过
MethodSignature获取带注解的方法 - 不加
@Retention或设为CLASS,运行时就拿不到注解信息 - 一般不需要
@Documented或@Inherited,除非有文档生成或继承需求
错误用法提醒
别写成数组形式 @Target({ElementType.METHOD}) —— 虽然语法合法,但没必要,反而显得冗余。
立即学习“Java免费学习笔记(深入)”;
-
@Target(ElementType.METHOD)是标准写法 - 只有多个目标类型才用数组,例如
@Target({METHOD, TYPE}) - 写错成
ElementType.METHODS(多了一个 s)会编译失败
一个完整示例
定义一个记录方法执行时间的注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
String value() default "";
}
使用时只能写在方法上:
- ✅ 正确:
@LogExecutionTime public void doSomething(){...} - ❌ 编译报错:
@LogExecutionTime public class Service {...} - ❌ 编译报错:
private @LogExecutionTime String field;


















