小编tpu*_*der的帖子

Scala宏:检查Java字段是否标记为瞬态

如何使用Scala宏检查Java类字段上的ACC_TRANSIENT标志?

TermSymbol有像isPrivateisProtected这样的方法,但没有任何类型的isTransient方法.

检查Scala的瞬态

对于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?

但是,如果我有一个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)

scala scala-macros

5
推荐指数
1
解决办法
612
查看次数

标签 统计

scala ×1

scala-macros ×1