2010-03-31 2 views
2

그래서 우리는 사용중인 Java 도구가이 메소드를 찾을 것이므로 특정 리턴 유형 및 메소드 서명이있는 객체에 메소드를 동적으로 작성 (또는 삽입)해야합니다. Reflection을 통해 void 유형을 확인하십시오. 메서드 이름은 런타임에 결정됩니다.Groovy : 특정 서명이있는 메소드를 동적으로 추가합니다.

metaClass를 사용합니다. = {...} 그러나 (심지어 하나로서 사용될 수있는 경우에도) 정규 메소드로 표시되지 않는 클로저를 추가하고 리턴 유형도 있습니다.

코드 검색 방법을 수정할 수 없으며 Groovy를 인식하지 못합니다.

메서드가 실제로 존재해야하므로 methodMissing() 또는 invokeMethod()를 사용할 수 없습니다. Class.getMethods()를 오버로드 할 수 있다면 가능할 것이라고 생각하지만 어떻게 될지 알 수 없습니다.

Groovy에서 이것을 수행 할 수있는 방법이 있습니까?

+0

좀 더 구체적으로 기재 할 수 있습니까? 즉, 몇 가지 예제 코드를 제공하십시오. – noah

답변

2

AST Transformations을 사용하면 컴파일 타임에 코드를 추가 할 수 있지만 컴파일하지 않은 클래스에서는 작동하지 않으므로 아마 작동하지 않을 것입니다.

CGLIB 기반 프록시로 오브젝트를 대체 할 수 있습니다. 문제의 코드에 대해 더 구체적으로 설명 할 수 있다면 ...

EDIT : 조금 더 자세한 정보. Java 코드가 명시 적으로 groovyClass.invokeMethod("someMethod",args);을 호출하지 않으면 Groovy metaClass 매직을 Java에서 사용할 수 없습니다. 따라서 MetaClass를 사용하여 요청한 작업을 수행 할 방법이 없습니다. 어쩌면 CGLIB.

관련 문제