Scala 如何在Groovy脚本引擎中访问所传递类的超类的变量?

Scala 如何在Groovy脚本引擎中访问所传递类的超类的变量?,scala,groovy,scope,groovyshell,Scala,Groovy,Scope,Groovyshell,我正在从scala动态运行groovy脚本。还有一些类的实例通过setProperty()传递给groovy脚本。例如,假设您有一个名为TestA的类,而类TestB继承类TestA。您正在向groovy脚本传递一个类B的实例,如下所示 setProperty("testB", testB) // testB is an instance of class TestB 通过运行groovy脚本,我可以访问TestB中声明的变量。但是当我试图访问TestA的变量时,它是TestB的超类,groo

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

setProperty("testB", testB) // testB is an instance of class TestB
通过运行groovy脚本,我可以访问TestB中声明的变量。但是当我试图访问TestA的变量时,它是TestB的超类,groovy给出了一个错误,说“类没有这样的属性”

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


是否仍然可以在不使用setter/getter的情况下访问TestA的变量?像使用Expando之类的吗?

因为您不想自己编写getter/setter(这在Scala中是一个难看的样板文件),所以您可以简单地将注释(或)添加到希望从另一种JVM语言访问的任何字段中。这将为您提供更易访问的API

@scala.reflect.BeanProperty // generates getStatus() and setStatus() methods
var status = ""

实际上,在仔细考虑之后,您可以简单地访问Scala为自己生成的访问器方法。您可以从Groovy访问Scala的访问器方法,但是访问setter
变量_$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();
}

我希望有一些方法可以做到这一点,而不必为每个字段都写注释,但谢谢