2016-08-05 2 views
1

내부에 메서드를 삽입하는 프로세서에서 작업을 수행했는데 클래스 생성과 함께 객체를 생성하는 방법을 알아 내는데 어려움을 겪고 있습니다. 완전한 정규화되지 않은 이름의 자동 생성을 초래하지 않고 초기화. 나는 새로운 클래스를 만들어 왔습니다 :스푼을 사용하여 메서드 내에서 클래스를 생성하는 중

예를 들어, 내가 물건처럼 처리했습니다 방법 내에서 요소 전에 삽입 한 후

CtClass internal = getFactory().Core().createClass(); 

element.insertBefore(internal); 

하지만, 초기화 문을 만들 때 :

CtConstructorCall call = getFactory().Core().createConstructorCall(); 
call.setType(internal); 
internal.insertAfter(call); 

나는 E :

Maininternal은 특정 메서드 내 선언에도 불구하고, 모든 내부에있는 전체 클래스의 이름입니다
Main.internal initializedInternalObject = new Main.internal(); 

. 나는 getFactory()를 사용하여 내부 클래스를위한 Class(). create() 메소드를 사용하려고 시도했으나, 메소드 내에서 델파이 된 클래스와는 반대로 클래스 내에서 중첩 된 클래스를 대상으로하는 것으로 보인다.

클래스 선언에 문제가 있습니까? Spoon이 내부 클래스를 생성하는 기능에 한계가 있습니다. 어떤 제안?

감사합니다.

답변

0

하나의 가능한 해결책은 내부 클래스 이름 앞에 숫자를 붙이는 것입니다.

이 방법이 효과가 있습니까?

이상한 행동을보고하는데 주저하지 말고 Github issues을 사용하십시오.

+0

내부 클래스 이름 앞에 숫자를 붙이더라도 Spoon은 정규화 된 이름과 단순한 이름이 동일한 방법으로 로컬 클래스를 생성하는 것을 정말로 좋아하지 않는 것 같습니다. 내가 아는 한, 어쨌든 메서드의 범위 내에서 명명 된 클래스를 만드는 것은 나쁜 습관이지만, 내 특정 프로젝트에서는 반드시 필요합니다. 다행히도 코드 스 니펫 표현식을 사용하여 내부 클래스 유형 또는 생성자 호출과 관련된 표현식을 생성하는 것이 매우 간단하므로 큰 문제는 아닙니다. – Luke

+0

이 경우 스푼의 동작은 기능이 부족한 것처럼 "이상한"것 같지 않지만 [문제] (https : //github.com/INRIA/spoon/issues/) 페이지로 이동하십시오. – Luke

0

코드 스 니펫 표현식을 사용하면 주어진 내부 클래스의 형식 이름 및 생성자 호출과 관련된 식을 수동으로 재정의 할 수 있습니다. 예 :

String constructorCallSnippet = 
    "new " + classType.toString() + "(" 
    + String.join(", ", args.stream().map(a -> a.toString()).collect(toList())) 
    + ")"; 
CtExpression constructorCall = 
    getFactory().Code().createCodeSnippetExpression(constructorCallSnippet); 
관련 문제