0

scala からグルーヴィーなスクリプトを動的に実行しています。また、setProperty() を介して groovy スクリプトに渡されるクラスのインスタンスがいくつかあります。たとえば、TestA という名前のクラスがあり、クラス TestB がクラス TestA を継承しているとします。そして、クラス B のインスタンスをこのような groovy スクリプトに渡しています

setProperty("testB", testB) // testB is an instance of class TestB

groovy スクリプトを実行すると、TestB で宣言された変数にアクセスできます。しかし、TestBのスーパークラスであるTestAの変数にアクセスしようとすると、groovyは「クラスにそのようなプロパティはありません」というエラーを出します。

特定のインスタンスから TestA と TestB の両方のメソッドを呼び出すことができます。したがって、setter と getter を記述するだけで、TestA の変数にアクセスできますが、そうしたくありません。

セッター/ゲッターを使用せずにTestAの変数にアクセスする方法はありますか? Expandoなどを使用するのが好きですか?

4

2 に答える 2

2

getter/setter を自分で書きたくないので (Scala では醜いボイラープレートになります)、必要なフィールドにscala.reflect.BeanPropertyアノテーション (またはscala.reflect.BooleanBeanProperty ) を追加するだけです。別の JVM 言語からのアクセス。これにより、よりアクセスしやすい API が提供されます。

@scala.reflect.BeanProperty // generates getStatus() and setStatus() methods
var status = ""
于 2012-03-12T13:32:51.687 に答える
0

実際、もう少し考えてみると、Scala が生成するアクセサー メソッドに簡単にアクセスできます。Groovy から Scala のアクセサー メソッドにアクセスできる場合もありますが、setter へのアクセスはvariable_$eq少し奇妙に見えるかもしれません。

[dlee@dlee-mac scala]$ cat Prop.scala 
class Prop {
  var variable = "foo"
  val constant = "bar"
}

[dlee@dlee-mac scala]$ scalac Prop.scala 

[dlee@dlee-mac scala]$ javap Prop
Compiled from "Prop.scala"
public class Prop extends java.lang.Object implements scala.ScalaObject{
    public java.lang.String variable();
    public void variable_$eq(java.lang.String);
    public java.lang.String constant();
    public Prop();
}
于 2012-03-13T14:47:32.847 に答える