2011-08-29 21 views
3

私はスカラーにとって少し新しく、私の会社のためにいくつかのものをテストしようとしています。 私の問題は以下の通りです:Javaで保護されているとマークされたフィールドを持つ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のクラスTestあります。 Scalaに保護されているとマークするにはどうすればよいですか?本当にラウンドはありません。

+1

テストコードから 'id()'と 'id_ $ eq()'メソッドを呼び出せますか?さもなければ、私は唯一の選択肢はJavaで 'Test'クラスを定義することだと思います。つまり、Scalaで定義された 'val'と' var'はアクセサメソッドでしか利用できませんが、Javaで定義されたフィールドは読み書きできます。 –

答えて

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を使用することができます。

+0

清算していただきありがとうございます。私はいくつかのバイトコードを変更しなければならないと思われます... – user3001

2

は次のようにクラスを書いてみます

import scala.reflect.BeanProperty 

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

その後、あなたは「標準」POJOごとに、生成されたsetIdgetIdメソッドを取得します。

+0

はい私は知っている:)問題は、これは私を助けてくれないので、プライベートにするフィールドを好きではないデータベース層のためのいくつかのjvmバイトコードクラスの生成スタッフ。 .. – user3001

+0

その後、Hibernateの使用を止めてください:) https://wiki.scala-lang.org/display/SW/Tools+and+Libraries#ToolsandLibraries-DataStorage –

+0

これは休止状態ではありませんが、いくつかの自筆のもの – user3001

関連する問題