2013-04-18 2 views
2

.java 파일의 내용을 가지고있는 String이 있다고 해봅시다. 이 소스 파일을 가상 .class 파일로 컴파일 할 수있는 API가 있습니까 (예 : 디스크에 실제 물리적 .class 파일을 생성하지 않고 메모리에 콘텐츠를 생성하고 저장)? 그리고이 "가상".class가로드되어 JVM에서 실행됩니까?메모리에있는 자바 소스 파일을 컴파일하고 실행하십시오.

편집 1 : 내가 원할 때 유일한 이유는 가끔 내 응용 프로그램에 쓰기 권한이 없을 수 있기 때문입니다.

+0

아마도 그렇지는 않지만 (적어도 리눅스에서는) 파일을 디스크가없는 파일 시스템 (예 :'tmpfs ')에서 만들 수 있으며 메모리에서 작업하는 것보다 거의 빠릅니다. 어쩌면 당신은 당신 자신의'ClassLoader' –

+0

*을 작성할 수 있습니다. "내 응용 프로그램에 쓰기 권한이 없을 수도 있습니다."* Java 또는 DYM OS 보안 설정에 의해 샌드 박싱 되었기 때문입니까? –

+0

@ 앤드류 톰슨 둘 다. 내 응용 프로그램이 인터넷에서 다운로드되기 때문에 Java에 의해 sandboxed 될 수 있습니다. 사용자가 Windows에서 C : \와 같은 일부 디렉토리에 jar 파일 (내 앱)을 저장하기로 결정했을 수 있기 때문에 OS에 의해. – 0x56794E

답변

1

이 경우 JavaCompiler을 사용하십시오. 트릭은 사용자 정의 JavaFileManager을 정의하는 것이 될 것이라고 생각합니다.

1

Java에 파일을 동적으로 컴파일하는 데 compilation API이 있지만 클래스 파일을 디스크에 유지하지 않는 옵션을 인식하지 못합니다. 항상 ClassLoader을 사용하여 해당 클래스를 동적으로로드 한 다음 사용할 수 있습니다. getFileForOutput 메서드를 재정 의하여 메모리에 클래스를로드 할 수 있습니다.

선택적으로이 파일 관리자는 형제를 에 대한 힌트로 간주하여 출력 위치를 지정할 수 있습니다. 이 힌트의 정확한 의미는 입니다. 예를 들어 JDK 컴파일러 javac는 클래스 파일 출력 디렉토리가 제공되지 않는 한 클래스 파일을 원래 소스 파일과 동일한 디렉토리에 배치합니다. 이 동작을 용이하게하기 위해 이 메서드를 호출하면 javac이 원본 소스 파일을 형제로 제공 할 수 있습니다.

다른 옵션은 java 코드를 실행하는 BeanShell과 같은 인터프리터를 사용하는 것입니다. 스크립트와 같은 코드를 실행하고 repl 모드로 작업 할 수 있습니다.

관련 문제