我声明了一个类:
trait TO {
@BeanProperty var id: String = _
@BeanProperty var age : Int = _
@BeanProperty var createdAt : Long = _
@BeanProperty var disable: Boolean = _
}
class UMTTestObject extends TO {
@BeanProperty var inner: UMTInnerTO = _
}
class UMTInnerTO extends TO{}
和反射,这并不适用于setAge的UMTInnerObject:
setter.invoke(inner, 0)
setter是UMTInnerObject的setAge, inner是UMTInnerObject的一个实例
错误信息显示:
. lang。NoSuchMethodError: me.baihe.blackhole.luna.helpers.TO class.setAge美元(Lme/百合/黑洞/月亮/帮手;I) V
这很令人费解——
有人知道为什么吗?
这个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反射文档来了解代码片段中发生了什么。
,
UPDATED:无论如何,如果你仍然对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的文章可能会有所帮助。