Java 如何使注释仅在一个目标上不推荐使用

Java 如何使注释仅在一个目标上不推荐使用,java,annotations,deprecated,Java,Annotations,Deprecated,我有一个注释,可以添加到方法和类型中,并在我们项目的数千个地方使用 @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @Target({METHOD, TYPE}) @Inherited public @interface RequiredStore{ Store value(); } 是否可以使注释仅在方法上不推荐使用,而在类型上不推荐使用?我希望IDE通知其他开发人员,在我们重构所有现有用法并最终删除方法部分之前,它不

我有一个注释,可以添加到
方法
类型
中,并在我们项目的数千个地方使用

@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD, TYPE})
@Inherited
public @interface RequiredStore{
    Store value();
}
是否可以使注释仅在方法上不推荐使用,而在类型上不推荐使用?我希望IDE通知其他开发人员,在我们重构所有现有用法并最终删除
方法
部分之前,它不应再用于方法


如果不可能,除了只为类型创建新注释和弃用旧注释之外,还有什么方法可以处理这种情况吗?

您可以使用注释

例如,注释及其处理器将放在自己的
.jar
文件中,并作为使用注释的源的依赖项添加

自定义的
.jar
将具有以下结构:

src/main/ java/com/company/annotations/ RequiredStore.java RequiredStoreProcessor.java resources/META-INF/services javax.annotation.processing.Processor
javax.annotation.processing.Processor
文件允许
javac
通过SPI拾取处理器,并且只包含

com.company.annotations.RequiredStoreProcessor 编译器警告如下:

warning: Using @RequiredStore on methods has been deprecated Class: com.company.business.Business Method: someMethod 警告:已不推荐在方法上使用@RequiredStore 类别:com.company.business.business 方法:某些方法 至于IDE中的指示,您可能必须编写自定义检查,不幸的是,这取决于使用的IDE


笔记:
体面的自定义注释参考:

如果您对使用本机aspectj没有意见,另一个选择是以这种方式使用aspectj的代码强制策略:

public aspect RequiredStoreAnnotationCheck {

    declare warning: execution(@RequiredStore * *.*(..)) : "Required store annotation not    appropriate for methods..";

}
如果IDE与AspectJ集成,这将标记为编译时检查

AspectJ in action book对此也有大量的细节


以下是我的一篇博客文章,内容如下:

除了您已经提出的建议之外,我想不出任何其他方法来实现它。您可能可以为IDE编写某种自定义检查,其他开发人员使用哪些IDE?我只是回来说“您可以在运行时检测到它(尽管不是在编译时检测到它)”这不是对需求的回答(也就是让IDE报告它),但我给它一个+1只是因为它是一个非常酷和有用的答案。我甚至不知道你能做到@Gimby是的,IDE不会将自定义注释的编译器警告/错误标记为AFAIK,这很不幸。但我认为您可以将上述内容与定制IntelliJ检查或Eclipse等效工具结合起来。 warning: Using @RequiredStore on methods has been deprecated Class: com.company.business.Business Method: someMethod
public aspect RequiredStoreAnnotationCheck {

    declare warning: execution(@RequiredStore * *.*(..)) : "Required store annotation not    appropriate for methods..";

}