我正在从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还是什么?
答案 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();
}