Java – you cannot use getdeclaraedfields() to retrieve fields from Scala classes

I'm trying to use Scala's Java library (johm) and notice that when lib tries to use something like model getClass(). Getdeclaraedfields() will fail when it reads the fields of my Scala class

Then I decided to try a simple example from the scala interpreter:

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()

In fact, we have no field at all

Now, what if I try this:

scala> class myClass2(attribute1: String,attribute3: String) { override def toString = this.attribute1 }
defined class myClass2

scala> val myInstance2 = new myClass2("value1","value3")
myInstance2: myClass2 = value1

scala> myInstance2.getClass().getDeclaredFields()
res1: Array[java.lang.reflect.Field] = Array(private final java.lang.String myClass2.attribute1)

Therefore, if you use a field in one of the class' methods, you can find it through getdeclaraedfields() What did I miss here?

Solution

What you are missing is that constructor parameters are not automatically promoted to fields

Instead, they are promoted only when used You use attribute1, so it becomes a field; You didn't use other people, so they didn't

If they are declared as Val or VaR, or if the class is a case class, they will also be promoted to fields (because they actually generate accessor methods, so they are used)

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>