【问题标题】:How do you access variables of super class of passed class in Groovy Script Engine?如何在 Groovy 脚本引擎中访问传递类的超类变量?
【发布时间】:2012-03-12 13:03:25
【问题描述】:

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

【问题讨论】:

    标签: scala groovy scope groovyshell


    【解决方案1】:

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

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

    【讨论】:

    • 我希望有一些方法可以在不为每个字段写注释的情况下做到这一点,但谢谢
    【解决方案2】:

    实际上,经过深思熟虑,您可以简单地访问 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      相关资源
      最近更新 更多