2009-12-30 6 views
3

외부 저장 소스 코드를 Java 프로그램에로드하여 사용할 수있는 방법이 있습니까?외부 소스 코드를 읽어 들이고 내부적으로 사용하기 (다시 컴파일 등으로)

완전한 소스 코드를 편집하지 않고 변경할 수있는 프로그램을 갖고 싶습니다. 매번이 코드를 컴파일하지 않아도 가능합니다. 또 다른 장점은 원하는 코드 부분을 변경할 수 있다는 것입니다.

물론이 인터페이스에 데이터를 보내고 고정 소스 프로그램으로 다시 가져올 수 있어야합니다.

물론 순수한 해석 시스템보다 빠릅니다.

외부 소스 코드 파트를 추가로 컴파일하고이를 완료 한 후에 프로그램을 시작하는 것과 같은 방법이 있습니까?

고맙습니다. Andreas :

답변

9

이 경우 javax.tools API이 필요합니다. 따라서 JDK가 작동하도록하려면 최소한 JDK가 설치되어 있어야하며 IDE에서 JRE 대신 IDE를 가리 키도록해야합니다. 테스트 소스 정적 초기화가 완료로

public static void main(String... args) throws Exception { 
    String source = "public class Test { static { System.out.println(\"test\"); } }"; 

    File root = new File("/test"); 
    File sourceFile = new File(root, "Test.java"); 
    Writer writer = new FileWriter(sourceFile); 
    writer.write(source); 
    writer.close(); 

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
    compiler.run(null, null, null, sourceFile.getPath()); 

    URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() }); 
    Class<?> cls = Class.forName("Test", true, classLoader); 
} 

이, 표준 출력에 test를 출력한다 : 여기서 (단지 기본적인 예 덜 불투명하게 적절한 예외 부호화 처리없이 기침) 염기성 킥오프 예제 암호. 이러한 클래스가 클래스 패스에 이미있는 특정 인터페이스를 구현하면 더 쉽게 사용할 수 있습니다. 그렇지 않으면 메소드/필드를 액세스하고 호출하기 위해 Reflection API을 참여시켜야합니다.

0

Java6에는 스크립팅 API가 있습니다. Javascript와 함께 사용했지만 외부 Java 코드도 컴파일 할 수 있다고 생각합니다.

http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/

편집 : 여기에 더 관련 링크입니다 : 자바 6에서 "Dynamic source" code in Java applications

+0

원본 질문에 "외부 저장 소스 코드"가 지정되었습니다. 마지막으로 클래스 로더를 검사 할 때 소스 코드를 바이트 코드로 컴파일하지 않았습니다. –

1

이상, 당신은 javax.tools 패키지를 통해 컴파일러에 액세스 할 수 있습니다. ToolProvider.getSystemJavaCompiler()는 javax.tools.JavaCompiler을 가져 오며 소스를 컴파일하도록 구성 할 수 있습니다. 이전 버전의 Java를 사용하는 경우 내부 com.sun.tools.javac.Main 인터페이스를 통해 여전히 Java에 액세스 할 수 있지만 유연성은 훨씬 떨어집니다.

관련 문제