0

我正在从 scala 动态运行 groovy 脚本。还有一些类的一些实例通过 setProperty() 传递给 groovy 脚本。例如,假设您有一个名为 TestA 的类,而类 TestB 继承了类 TestA。您正在将 B 类的实例传递给像这样的 groovy 脚本

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

并运行 groovy 脚本,我可以访问在 TestB 中声明的变量。但是当我尝试访问 TestA 的变量时,它是 TestB 的超类,groovy 给出了一个错误,说“类没有这样的属性”。

我仍然可以从给定的实例中调用 TestA 和 TestB 的方法。所以如果你只写setter和getter,我可以访问TestA的变量,但我不想这样做。

有没有在不使用 setter/getter 的情况下访问 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 的访问器方法,但访问 settervariable_$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 回答