Scala反射在这种情况下不能工作



我声明了一个类:

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的文章可能会有所帮助。

相关内容

  • 没有找到相关文章

最新更新