Scala 如何在Groovy脚本引擎中访问所传递类的超类的变量?
我正在从scala动态运行groovy脚本。还有一些类的实例通过setProperty()传递给groovy脚本。例如,假设您有一个名为TestA的类,而类TestB继承类TestA。您正在向groovy脚本传递一个类B的实例,如下所示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
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();
}
我希望有一些方法可以做到这一点,而不必为每个字段都写注释,但谢谢