我正在尝试将 Java 库 (JOhm) 与 Scala 一起使用,并注意到当该库尝试使用以下内容读取我的 Scala 类的字段时它会失败model.getClass().getDeclaredFields()
.
然后我决定尝试在 Scala 解释器中用简单的例子做同样的事情:
scala> import java.lang.reflect.Field;
import java.lang.reflect.Field
scala> class myClass(attribute1: String, attribute2: String, attribute3: String)
defined class myClass
scala> val myInstance = new myClass("value1", "value2", "value3")
myInstance: myClass = myClass@7055c39a
scala> myInstance.getClass().getDeclaredFields()
res0: Array[java.lang.reflect.Field] = Array()
事实上,我们根本没有任何字段。
现在,如果我尝试这样做会怎样:
scala> class myClass2(attribute1: String, attribute2: String, attribute3: String) { override def toString = this.attribute1 }
defined class myClass2
scala> val myInstance2 = new myClass2("value1", "value2", "value3")
myInstance2: myClass2 = value1
scala> myInstance2.getClass().getDeclaredFields()
res1: Array[java.lang.reflect.Field] = Array(private final java.lang.String myClass2.attribute1)
因此,如果在类的方法之一中使用字段之一,则可以通过 getDeclaredFields() 找到它。我在这里缺少什么?
你所缺少的是构造函数参数不会自动提升为字段.
相反,只有使用它们才能得到提升。你用过attribute1
于是它变成了一块田地;你没有使用其他的,所以他们也没有。
如果您将它们声明为val
or var
,或者该类是一个案例类,它们也将被提升为字段(因为它们实际上会生成访问器方法,从而被使用)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)