我对scala有点新意,并试图为我的公司测试一些东西。 我的问题如下: 有一个Scala类测试:
class Test {
var id: Int = 0
}
执行javap -private -c测试:
Compiled from "Test.scala"
public class com.example.Test extends java.lang.Object implements scala.ScalaObject{
private int id;
public int id();
Code:
0: aload_0
1: getfield #11; //Field id:I
4: ireturn
public void id_$eq(int);
Code:
0: aload_0
1: iload_1
2: putfield #11; //Field id:I
5: return
public com.example.Test();
Code:
0: aload_0
1: invokespecial #19; //Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: putfield #11; //Field id:I
9: return
}
如您所见,id变量本身被标记为私有。如何强制Scala将其标记为受保护?真的没有办法......
答案 0 :(得分:7)
由于uniform access principle,所有字段在Scala中都是私有的。但生成的方法不是。所以你可以在Java
:
Test test = new Test();
test.id_$eq( 23 );
System.out.println( test.id() ); //Should print "23"
如果您觉得难看,可以使用Java Beans accessors。
答案 1 :(得分:2)
尝试像这样编写类:
import scala.reflect.BeanProperty
class Test {
@BeanProperty var id: Int = 0
}
然后,根据“标准”POJO,您将获得生成的setId
和getId
方法。