首页 文章

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

提问于
浏览
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还是什么?

2 回答

  • 2

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

    @scala.reflect.BeanProperty // generates getStatus() and setStatus() methods
    var status = ""
    
  • 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();
    }
    

相关问题