2012-03-12 4 views
0

저는 scala에서 groovy 스크립트를 동적으로 실행하고 있습니다. 그리고 setProperty()를 통해 Groovy 스크립트에 전달 된 클래스의 인스턴스가 있습니다. 예를 들어, TestA라는 클래스가 있고 TestB 클래스가 TestA 클래스를 상속한다고 가정 해 봅시다. 그리고 당신이Groovy Script Engine에서 전달 된 클래스의 수퍼 클래스 변수에 어떻게 액세스합니까?

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

처럼 그루비 스크립트 클래스 B의 인스턴스를 통과하고 그루비 스크립트, 나는를 TestB에서 선언 된 변수에 액세스 할 수 있습니다 실행하고 있습니다. 하지만 TestB의 수퍼 클래스 인 TestA의 변수에 액세스하려고하면 그루비가 "클래스에 해당 속성 없음"이라는 오류 메시지를 표시합니다.

주어진 인스턴스에서 TestA와 TestB의 메소드를 여전히 호출 할 수 있습니다. 따라서 setter와 getter를 작성하면 TestA의 변수에 액세스 할 수 있지만 그렇게하고 싶지는 않습니다.

setter/getter를 사용하지 않고 TestA의 변수에 액세스 할 수 있습니까? Expando 같은 것을 사용하고 싶습니까? 당신이 게터을 쓰고 싶어하지 않기 때문에

답변

2

/다른 JVM에서 액세스하려는 당신은 단순히 어떤 분야에 scala.reflect.BeanProperty 주석 (또는 scala.reflect.BooleanBeanProperty)를 추가 할 수 있습니다 (스칼라에서 추한 상용구 될 것이다) 자신을 세터 언어. 이렇게하면 더 많은 API에 액세스 할 수 있습니다.

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

각 필드에 특수 효과를 쓰지 않고도 할 수있는 방법이 있었으면 좋겠다고 생각했지만 감사합니다. – Elonoa

0

사실 더 생각해 본 다음에는 스칼라가 자체적으로 생성하는 접근 자 메서드에 액세스 할 수 있습니다. Groovy에서 스칼라의 접근 자 메서드에 액세스 할 수 있지만 설정자 variable_$eq에 액세스하는 것은 다소 이상하게 보일 수 있습니다.

[[email protected] scala]$ cat Prop.scala 
class Prop { 
    var variable = "foo" 
    val constant = "bar" 
} 

[[email protected] scala]$ scalac Prop.scala 

[[email protected] 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(); 
}