Scala类,其字段在java中标记为受保护

Scala类,其字段在java中标记为受保护,java,scala,jvm,Java,Scala,Jvm,我对scala有点陌生,正在尝试为我的公司测试一些东西。 我的问题如下: 有一个Scala类测试: 类测试{ 变量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:

我对scala有点陌生,正在尝试为我的公司测试一些东西。 我的问题如下: 有一个Scala类测试:

类测试{
变量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

}
从“Test.scala”编译而来
公共类com.example.Test扩展了java.lang.Object实现了scala.ScalaObject{
私有int-id;
公共int id();
代码:
0:aload_0
1:getfield#11;//字段id:I
4:我轮到你了
公共无效id_u$eq(int);
代码:
0:aload_0
1:iload_1
2:putfield#11;//字段id:I
5:返回
public com.example.Test();
代码:
0:aload_0
1:invokespecial#19;//方法java/lang/Object。“:()V
4:aload_0
5:iconst_0
6:putfield#11;//字段id:I
9:返回
}
如您所见,id变量本身被标记为private。如何强制Scala将其标记为受保护?因为,所有字段在Scala中都是私有的。但生成的方法不是。因此,您可以在
Java
中执行以下操作:

Test test = new Test();
test.id_$eq( 23 );
System.out.println( test.id() ); //Should print "23"

如果你觉得很难看,你可以使用。

试着这样写这个类:

import scala.reflect.BeanProperty

class Test {
  @BeanProperty var id: Int = 0
}

然后,您将根据“标准”POJO获得生成的
setId
getId
方法。

您可以从测试代码中调用
id()
id\u$eq()
方法吗?否则,我认为唯一的选择是在Java中定义类
Test
。也就是说,Scala中定义的
val
var
只能通过访问器方法使用,但Scala仍然可以读取/写入Java中定义的字段。是的,我知道:)问题是这对我没有帮助,因为它是数据库层的jvm字节码类生成工具,不希望字段是私有的……那么停止使用Hibernate:)您会在这里找到一系列更合适的替代方法:它不是Hibernate,而是一些自写的工具