如何在Groovy Script Engine中访问传递类的超类变量?

时间:2012-03-12 13:03:25

标签: scala groovy scope groovyshell

我正在从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还是什么?

2 个答案:

答案 0 :(得分:2)

由于您不想自己编写getter / setter(这在Scala中是难看的样板文件),您只需将scala.reflect.BeanProperty注释(或scala.reflect.BooleanBeanProperty)添加到您的任何字段中即可。 d喜欢从另一种JVM语言访问。这将为您提供更易于访问的API。

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

答案 1 :(得分: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();
}
相关问题