Как получить доступ к переменным суперкласса переданного класса в Groovy Script Engine?

Я динамически запускаю groovy-скрипты из scala. И есть несколько экземпляров какого-то класса, переданного в groovy-скрипты через setProperty(). Например, предположим, что у вас есть класс с именем TestA, а класс TestB наследует класс TestA. И вы передаете экземпляр класса B в отличный скрипт, подобный этому

setProperty("testB", testB) // testB is an instance of class TestB

и запустив отличный скрипт, я могу получить доступ к переменным, объявленным в TestB. но когда я пытаюсь получить доступ к переменным TestA, который является суперклассом TestB, groovy выдает сообщение об ошибке «Нет такого свойства для класса».

Я все еще могу вызывать методы TestA и TestB из данного экземпляра. Поэтому, если вы просто напишете сеттер и геттер, я смогу получить доступ к переменным TestA, но я не хочу этого делать.

Есть ли способ получить доступ к переменным TestA без использования сеттера/геттера? например, использовать Expando или что-то в этом роде?


person Elonoa    schedule 12.03.2012    source источник


Ответы (2)


Поскольку вы не хотите сами писать геттеры/сеттеры (что было бы уродливым шаблоном в Scala), вы можете просто добавить scala.reflect.BeanProperty (или scala.reflect.BooleanBeanProperty) в любые поля, к которым вы хотите получить доступ из другого языка JVM. Это даст вам более доступный API.

@scala.reflect.BeanProperty // generates getStatus() and setStatus() methods
var status = ""
person leedm777    schedule 12.03.2012
comment
Я надеялся, что есть способ сделать это без написания аннотации к каждому полю, но спасибо - person Elonoa; 13.03.2012

На самом деле, немного подумав, вы могли бы просто получить доступ к методам доступа, которые Scala генерирует для себя. Вы можете получить доступ к методам доступа Scala из Groovy, но доступ к сеттеру 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();
}
person leedm777    schedule 13.03.2012