2015-02-02 1 views
1

AST 변환을 사용하는 클래스의 메서드를 대체하려고합니다.Groovy AST 변환 - 대체 메서드

먼저 메서드가 있는지 확인한 다음 제거합니다 (based on this).

MethodNode methodNode = parentClass.getMethod(methodName, Parameter.EMPTY_ARRAY) 
if (methodNode != null) { 
    parentClass.getMethods().remove(methodNode) 
} 

컬렉션의 크기가 변경되었지만 클래스 노드에서 계속 액세스 할 수 있습니다.

방법을 제거한 후 나는 그 같은 이름의 새로운 추가하고 싶습니다 :

Repetitive method name/signature for method 'grails.plugin.Bar getBar()' in class 'grails.plugin.Foo'. 

하는 올바른 방법은 무엇 :

그러나
parentClass.addMethod(newMethodNode) 

, 이것은 다음과 같은 오류가 발생합니다 이 작업을 수행?

는 업데이트 : 내가 할 의도 된 모든 이후 메소드의 기능을 기존의 내가 대신 새로운 block statement을 만들어 대체 methodNode.setCode(statement)를 사용하여 기존의 방법에 설정했다.

답변

0

당신이하려고하는 것과 같은 소리는 다른 것들로 방법을 감싸는 것입니까? 다음은 try/finally 메서드를 래핑하는 예제입니다. 실제로 난 그냥 그것을 포장하는 것을 시도하고 있지 않다 :)

+0

전에 방법을 제거 할 수 있지만의 몸 전체를 교체하려고 시도 적이 있기 때문에 내가 도울 수 아니에요 그 외에는

import org.codehaus.groovy.ast.* import org.codehaus.groovy.ast.expr.* import org.codehaus.groovy.ast.stmt.* methodNode.setCode(methodThatCreatesAst(methodNode.getCode())) def methodThatCreatesAst(Statement statementToWrap) { BlockStatement methodBody = new BlockStatement() methodBody.addStatement(new TryCatchStatement( // try statementToWrap, // finally new ExpressionStatement( new MethodCallExpression( "myVar", "myMethod", new ArgumentListExpression() ) ) )) return methodBody } 

새로운 기능을 갖춘 메소드. 제안 해 주셔서 감사합니다. – cweston