我已经定义了以下java Annotation
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
}
Run Code Online (Sandbox Code Playgroud)
我定义了以下scala案例类:
@Prefer("xyz")
case class TestAnno(arg1 : String, @Prefer("abc") agr2 : String)
Run Code Online (Sandbox Code Playgroud)
我能够使用反射看到在案例类级别定义的注释,但是我无法访问arg2
为案例类成员定义的注释TestAnno
.反编译代码我发现变量声明或它的scala访问器似乎都没有注释.只有构造函数定义和copy
方法似乎保留了case类声明中定义的参数的注释.
是否有其他方法可以强制scala编译器为case类中声明的字段生成注释,或者我必须读取构造函数并使用诸如ASM ByteCode Library或ParaNamer之类的库来查找哪些参数具有哪些注释?需要一个主要适用于Scala案例类的解决方案.
我创建了Java注释(因为我需要运行时保留)$PROJECT/src/main/java
和我的scala代码,我们使用这些java注释$PROJECT/src/main/scala
.这样创建的Java注释也使用Java ENUM作为它的值.
如果我编译项目,那么sbt似乎不会首先编译Java注释,并且在注释中每次使用枚举时都会出错.如果我在scala代码中的注释中注释掉Java枚举的所有用法并进行编译,取消注释枚举用法并再次编译它一切正常.
$PROJECT/src/main/java
在执行干净构建时,如何确保sbt 在尝试编译scala代码之前编译我的java注释和枚举(即)?
编辑:我有一个裸骨build.sbt,我正在使用sbt 0.11.2