2012-11-28 2 views
1

JCodeModel을 사용하여 자바 소스를 생성 중이며 이제 런타임에 컴파일하려고합니다. 하지만 이전에 디스크에 Java 파일을 쓰고 싶지는 않습니다.런타임시 동적으로 생성 된 클래스를 파일에 쓰지 않고 쓰기

필자가 볼 수있는 한 동적 컴파일은 javax.tools.JavaCompiler (see example)에서 가능하지만이 경우 소스 코드가 필요한 것처럼 보입니다.

불행히도 JDefinedClass에서 소스 코드를 직접 가져올 수있는 방법을 찾을 수 없습니다. 디스크의 File 객체에 JDefinedClass를 쓰고 이후에 소스를 읽어야하는 것처럼 보입니다.

정말 필요한가, 아니면 몇 가지 해결 방법이 있습니까?

+0

어쩌면 당신이와 Javassist 또는 CGLIB를 시도해야한다? – hoaz

+0

CGLIB는 더 이상 유지 관리되지 않으며 문서화가 제대로되어 있지 않은 것으로 보입니다. 사실 HelloWorld 클래스 또는 무언가가 생성되는 간단한 예제를 찾을 수 없습니다. Javaassist는 소스 코드를 생성 할 가능성을 제공하지 않는 것 같습니다. 단지 바이트 코드를 조작하기위한 것입니다. 다른 이유로 인해 소스 코드가 필요합니다. – Morrandir

+0

제공 한 기사에'JavaFileObject'의 샘플 구현이 있습니다. 그것은'DynamicJavaSourceCodeObject'라고 불리며, string을 매개 변수로 취합니다. 컴파일 할 때 파일에 쓸 필요가 없습니다. 'JavaCompiler'에 피드하십시오. – hoaz

답변

1

당신은 SingleStreamCodeWriter를 사용하여 디스크 작업을 방지하고 메모리에 직접 코드를 작성하기 위해 다음 코드를 사용할 수 있습니다

JCodeModel jCodeModel = createJCodeModel(); // create and prepare JCodeModel 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
CodeWriter codeWriter = new SingleStreamCodeWriter(baos); 
jCodeModel.build(codeWriter); 

String code = baos.toString(); // you can use toString(charset) if there are special characters in your code 
+0

감사합니다. 첫 번째 라인이 생성되는 것을 제외하고는 매력처럼 작동합니다. "------- 정규화 된 클래스 이름 ------"과 같은 것을 포함합니다. 쉽게 필터링 할 수 있습니다. – Morrandir

관련 문제