2

我声明了一个类:

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{}

并且在反思中,这对于 UMTInnerObject 的 setAge 不起作用:

setter.invoke(inner, 0)

而 setter 是 UMTInnerObject 的 setAge,inner 是 UMTInnerObject 的一个实例

错误消息显示:

java.lang.NoSuchMethodError: me.baihe.blackhole.luna.helpers.TO$class.setAge(Lme/baihe/blackhole/luna/helpers/TO;I)V

这很令人困惑——

有谁知道为什么?

4

1 回答 1

2

这个 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的帖子可能会有所帮助。

于 2013-04-24T13:38:25.647 回答