2012-06-06 4 views
0

현재 사용자 입력을 기반으로 Java 클래스 파일을 출력하는 도구를 만들고 있습니다. 나는 현재 컨텍스트에 존재하지 않는 참조 클래스와 변수 중 일부를 포함하는 .java 파일 세트를 출력했다. 이 때문에 컴파일 할 때 출력 파일은 이러한 오류를 기록하고 클래스를 컴파일하지 않습니다. 내 질문은 : JavaCompiler를 사용하여 클래스 파일을 컴파일하는 방법이 있습니까?JavaCompiler API 강제 컴파일 오류가 있습니까?

public static void compileAll(File file) throws IOException{ 
    String fileToCompile = "C:/test.java"; 
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
    FileOutputStream errorStream = new FileOutputStream("Errors.txt"); 
    int compilationResult = compiler.run(null, null, errorStream, "-verbose", fileToCompile); 
    if(compilationResult == 0){ 
     System.out.println("Compilation is successful"); 
    }else{ 
     System.out.println("Compilation Failed"); 
    } 
} 

답변

0

Q : 같이 클래스 파일을 컴파일하여 JavaCompiler를 사용하는 방법은 무엇입니까

여기에 컴파일 코드는?

예 : 컴파일 할 수 있습니다 : 필요에 따라 더미 방법 및/또는 더미 클래스를 생성

+0

인터페이스로 정의한 다음이를 구현하는 더미 메소드를 추가하십시오. 그런 식으로 교체하는 것이 더 빠를 수 있습니다. – SJuan76

+0

이렇게 할 방법이 없다고 말하는 것입니까? 필요한 모든 수업을 다시 만드는 것이 번거롭기 때문입니다. –

0

자바 컴파일러는 유형뿐만 아니라의 이름을 알 필요가 있기 때문에 당신이 원하는 것은 불가능합니다 바이트 코드 생성 시간에 변수 및 메소드 Java 바이트 코드가 입력되고 일부 Java 소스 레벨 변환이 JVM에 알려지지 않았기 때문에 (예 : unboxing 변환은 완전히 Java 컴파일러 규칙 임) 컴파일러는 "load field f"또는 "call 방법 foo "; 컴파일러는 "double 유형의로드 필드 f"또는 "int(double, Object) 유형의 f 메소드 호출"이라고 말해야합니다.

가 개체의 알 수없는 필드를 판독하고 double 지역 변수에 할당 고려 :

double d = o.f; 

f의 유형 double 경우, 컴파일러는 단순히 지역에 dstore 다음에 getfield를 사용합니다 가변 슬롯 d. f 유형이 int 인 경우 컴파일러에서 getfielddstore 사이의 i2d 명령을 내고 intdouble으로 변환합니다. fDouble 인 경우 컴파일러는 doubleValue()을 호출하여로드 된 값을 저장하기 전에 unbox합니다. fObject 인 경우 캐스트가없는 자바에서는 할당이 유효하지 않습니다 (합법적 인 경우 checkcast 명령어가됩니다). x의 클래스에 x이라는 필드가 없으면이 할당에 대한 가능한 번역이 없습니다.

알 수없는 서명이있는 메소드를 호출 할 때 비슷한 고려 사항이 적용됩니다 (각 인수에 대해 변환이 필요하거나 varargs 호출을위한 배열을 작성하는 경우). 또한 JVM 수준에서는 반환 형식에 대한 오버로드가 허용되므로 인수 형식 목록이 하나만있는 경우에도 반환 형식을 지정해야합니다.

당신이 할 수있는 최선은 컴파일러가 무엇을 해야할지 알 수 있도록 알 수없는 클래스의 더미 선언을 제공하는 것입니다. paulsm4의 대답에 의해 제안되었습니다.