如何使用Scala宏检查Java类字段上的ACC_TRANSIENT标志?
TermSymbol有像isPrivate和isProtected这样的方法,但没有任何类型的isTransient方法.
对于Scala类,使用@transient注释生成带有ACC_TRANSIENT标志的字段:
class ScalaExample {
@transient protected var ignoredField: String = null
}
Run Code Online (Sandbox Code Playgroud)
在类文件中,您最终得到:
private transient java.lang.String ignoredField;
descriptor: Ljava/lang/String;
flags: ACC_PRIVATE, ACC_TRANSIENT
Run Code Online (Sandbox Code Playgroud)
然后在宏中我可以看到@transient注释:
scala> typeOf[ScalaExample].member(TermName("ignoredField")).asTerm.accessed.annotations
res0: List[universe.Annotation] = List(scala.transient)
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个Java类:
public class JavaExample {
protected transient String ignoredField;
}
Run Code Online (Sandbox Code Playgroud)
哪个产生类似的字节码(该字段受保护而不是私有):
protected transient java.lang.String ignoredField;
descriptor: Ljava/lang/String;
flags: ACC_PROTECTED, ACC_TRANSIENT
Run Code Online (Sandbox Code Playgroud)
没有注释:
scala> typeOf[JavaExample].member(TermName("ignoredField")).asTerm.accessed.annotations
java.lang.AssertionError: assertion failed: variable ignoredField
at scala.reflect.internal.Symbols$Symbol.accessed(Symbols.scala:1978)
at scala.reflect.internal.Symbols$Symbol.accessed(Symbols.scala:1974)
at scala.reflect.internal.Symbols$TermSymbol.accessed(Symbols.scala:2658) …Run Code Online (Sandbox Code Playgroud)