这个 REPL 会话展示了如何使用 Scala 反射 API 调用 setter:
scala> import scala.reflect.runtime. { universe => ru }
import scala.reflect.runtime.{universe=>ru}
scala> trait TO { var age: Int = _ }
defined trait TO
scala> class UMTInnerTO extends TO
defined class UMTInnerTO
scala> val inner = new UMTInnerTO
inner: UMTInnerTO = UMTInnerTO@173379f
scala> val m = ru.runtimeMirror(inner.getClass.getClassLoader)
m: reflect.runtime.universe.Mirror ...
scala> val im = m.reflect(inner)
im: reflect.runtime.universe.InstanceMirror = instance mirror for UMTInnerTO@173379f
scala> val setterSymb = (ru.typeOf[UMTInnerTO].members find (_.name.decoded == "age_=")).get
setterSymb: reflect.runtime.universe.Symbol = method age_=
scala> val setter = im.reflectMethod(setterSymb.asMethod)
setter: reflect.runtime.universe.MethodMirror = method mirror for TO.age_$eq(x$1: scala.Int): scala.Unit (bound to UMTInnerTO@173379f)
scala> inner.age
res0: Int = 0
scala> setter(5)
res1: Any = ()
scala> inner.age
res2: Int = 5
您可以访问Scala 反射文档以了解代码段中发生的情况。
--
更新:无论如何,如果您仍然对 Java API 感兴趣,我们开始吧!
您应该知道 Scala 中的setter不使用 Java 命名约定。您将找不到setAge
方法(至少,如果您不手动声明它)。相反,您必须搜索一种age_=
方法。
scala> classOf[UMTInnerTO].getMethod("age_$eq", classOf[Int])
res0: java.lang.reflect.Method = public void UMTInnerTO.age_$eq(int)
scala> inner.age
res1: Int = 0
scala> res0.invoke(inner, 3: Integer)
res2: Object = null
scala> inner.age
res3: Int = 3
这篇关于 getter 和 setter的帖子可能会有所帮助。