Java 剥离内部注释

Java 剥离内部注释,java,annotations,java-annotations,gradle-dependencies,Java,Annotations,Java Annotations,Gradle Dependencies,我有一个Android库模块,其中一个公共类使用来自外部库的一些注释。注释纯粹是在内部使用的,因此我不想将其作为APIGradle依赖项公开,从而将该依赖项泄漏给客户端,而是将其作为实现之一保留 但是,注释的存在会对使用my library的应用程序发出警告,因为无法解析注释类。这实际上是可以理解的-一个公共类包含一个不在客户端编译路径上的符号-但是有没有一种方法可以在打包库时将注释保存在内部-或者被调用的应用程序忽略?注释是运行时的保留注释,因此它们不能在构建步骤或类似步骤中完全剥离 用于说明

我有一个Android库模块,其中一个公共类使用来自外部库的一些注释。注释纯粹是在内部使用的,因此我不想将其作为
API
Gradle依赖项公开,从而将该依赖项泄漏给客户端,而是将其作为
实现
之一保留

但是,注释的存在会对使用my library的应用程序发出警告,因为无法解析注释类。这实际上是可以理解的-一个公共类包含一个不在客户端编译路径上的符号-但是有没有一种方法可以在打包库时将注释保存在内部-或者被调用的应用程序忽略?注释是
运行时的
保留注释,因此它们不能在构建步骤或类似步骤中完全剥离

用于说明目的的设置:

我的库:

  • build.gradle
    具有
    实现com.example.foobar
    ,其中包含
    @example
    注释
  • Foo.java
    是一个用
    @Example
    注释的公共类:
  • my library
    本身中的其他类要求在运行时显示注释
一些客户:

  • build.gradle
    具有
    implementation com.example.mylibrary
    ,其中包含类
    Foo
  • 此应用程序使用
    Foo
    对象,但不需要了解注释,但在构建时会得到:

如果我将
com.example.foobar
implementation
更改为
API
,警告将被消除,但应用程序现在将在其构建路径上获得
@example
注释,这是一个内部实现细节。还有其他方法吗?

如果您不希望注释在运行时出现,那么为什么要将它们标记为
runtime
retention?如果您不希望它们在构建工件中可见,请将它们转换为
源代码
保留注释。如果这不是一个选项,那么你可以做Android本身做的事情:有两个不同的构建工件,一个是你构建和运行的实际代码,另一个是作为其他人编译时使用的API(除了你的情况,第二个也可以是完全工作的,但不同的工件)。它们用于对象的序列化。是的,我可以发明一些东西来创建单独的剥离工件,但这似乎有点过分。但是,谢谢。如果您需要在运行时显示这些类,那么在运行时就没有办法在用户的类路径上要求它们。或者,只有在不在某个客户端的上下文中运行时(即仅在某个内部工具中运行,但在由用户代码加载时不运行),您的库才需要注释?
@Example(foo = "bar")
public class Foo {
   ...
}
classes.jar(com/example/Foo.class): warning: Cannot find annotation method 'foo()' in type 'Example': class file for com.example.Example not found