>

설정 클래스와이를 구성하는 Groovy 스크립트가 있습니다. 설정 클래스는 다음과 같습니다.

abstract class Settings extends Script {
  private static String resourceRoot
  static String getResourceRoot() { return resourceRoot } 
  static void setResourceRoot(String root) { resourceRoot = root }
  abstract void apply();
  @Override
  void run() {
    apply()
    return null
  }
}

resourceRoot 를 설정하는 데 사용하려는 스크립트  속성은 다음과 같습니다 :

/* conf/settings.groovy */
@Base Settings settings
println "Running script"
resourceRoot = 'src/test/resources' // Does nothing


이 파일을 실행하면 "실행 스크립트"메시지가 표시되지만 Settings.resourceRoot 를 인쇄하면 , 나는 null을 얻는다.

그러나 pyzwyz를 명시 적으로 호출하면  그리고 setResourceRoot(String)  스크립트에서 모든 것이 정상적으로 작동합니다.

이것은 예상되는 동작입니까?

getResourceRoot()

  • 답변 # 1

    확실히 setProperty 에 전화  스크립트 내에서 실제 기본 클래스가 아닌 스크립트 바인딩에 위임됩니다. 이것은 Groovy 소스에 따른 코드입니다 :

    public void setProperty(String property, Object newValue) {
      if ("binding".equals(property))
        setBinding((Binding) newValue);
      else if("metaClass".equals(property))
        setMetaClass((MetaClass)newValue);
      else
        binding.setVariable(property, newValue);
    }
    
    

    내 문제를 해결하기 위해 setProperty 를 대체했습니다.  이 방법 :

     @Override
      void setProperty(String propertyName, Object newValue) {
        metaClass.setProperty(this, propertyName, newValue)
      }
    
    

    이제 작동합니다. 소스 기사. ​​

관련 자료

  • 이전 javascript - Angular의 JSON 파이프는 "정의되지 않은"값에 대해 빈 문자열을 인쇄합니다
  • 다음 R 중첩 루프의 예외