문제

Java 5 및 Java 6의 임의의 문자열 (메모리)에서 Java 코드를 컴파일하려면 어떻게로드하고 (사전 정의) 특정 메소드를 실행할 수 있습니까?

당신이 이것을 화염시키기 전에, 나는 기존 구현을 살펴 보았습니다.

  • 대부분 Java 6 컴파일러 API에 의존합니다.
  • 그렇지 않은 사람들은 속임수에 의존합니다.
  • 예, Commons-JCI를 확인했습니다. 그것이 어떻게 작동하는지 이해하기에는 너무 조밀하거나 그렇지 않습니다.
  • 컴파일러에 현재 클래스 경로를 공급하는 방법을 찾을 수 없었습니다.
  • (Java 6에서) 작동 한 구현에서 내부 클래스 (또는 내부 익명 클래스)를 올바르게로드하는 방법을 찾을 수 없었습니다.
  • 여러 환경에서 일이 진행되면서 전체가 메모리 인 경우를 원할 것입니다.

나는 이것이 전에 해결되었다고 확신하지만, Google에서 반 생산 품질조차도 보이는 것을 찾을 수 없습니다 (이전에 말했듯이 JCI를 제외하고는 사용하지 않았습니다).

편집하다:

  • 나는 Javaassist를 살펴 보았습니다 - 내부 수업, Java 5.0 언어 레벨 지원 및 전체 클래스 경로와 컴파일해야합니다. 또한 즉시 새로운 수업을 만들고 싶습니다. 나는 실수했을지 모르지만 Javaassit 으로이 작업을 수행하는 방법을 찾지 못했습니다.
  • 파일 시스템 기반 솔루션 (javac 호출)을 기꺼이 사용하려고하지만 클래스 경로를 신성하는 방법이나 나중에 클래스 경로에 있지 않은 파일 (내 클래스 경로가 아닌)을 특수 클래스 로더로로드하는 방법을 모르겠습니다. 여러 번의 호출을 위해 재활용되었습니다. 연구 방법을 알고 있지만 준비된 솔루션을 선호합니다.

edit2 : 지금은 Beanshell "Evaluate"에 만족합니다. 분명히 그것은 내가 필요한 모든 것을 수행합니다 (문자열을 얻고 '현재'클래스 경로의 맥락에서 평가하십시오. Java 5 기능 중 일부를 놓치지 만 열거 (정의되지 않음)를 사용하고 '일반'(지우기)을 컴파일 할 수 있습니다. ) 수업, 그래서 내가 원하는 것을 위해 충분해야합니다.

더 나은 해결책이 나오기를 희망하기 때문에 아직 받아 들여진대로 답변을 표시하고 싶지 않습니다.

edit3 : 콩나무 제안을 받아 들였습니다. 정말 훌륭하게 작동합니다.

도움이 되었습니까?

해결책

컴파일에 완전히 연결되어 있지 않은 경우 Beanshell, Groovy 및 기타 스크립팅 언어와 같은 솔루션이 쉽게 내장되어 있습니다 (즉, Java는 스크립팅 언어를 연결하는 데 도움이되는 내장 지원을 제공하여 코드가 어떤 언어를 알지 못합니다. 스크립트가 작성되었습니다)

Beanshell은 100% Java 코드 IIRC를 실행해야하며 Groovy는 대부분의 Java 코드를 실행할 수 있다고 생각합니다.

다른 팁

JCI는 괜찮아 보입니다. 이 코드 스 니펫은 기본이어야합니다.

JavaCompiler compiler = new JavaCompilerFactory().createCompiler("eclipse");

MemoryResourceReader mrr = new MemoryResourceReader();
mrr.add("resource name string", yourJavaSourceString.getBytes());

MemoryResourceStore mrs = new MemoryResourceStore();

CompilationResult result = compiler.compile(sources, mrr, mrs);

// don't need the result, unless you care for errors/warnings
// the class should have been compiled to your destination dir

이것이 작동하지 않아야하는 이유가 있습니까?


편집하다: 추가 a MemoryResourceStore 요청 된 것처럼 컴파일 된 클래스 출력을 메모리로 보냅니다.

또한 설정 javac 귀하의 경우 ClassPath와 같은 설정은 setCustomArguments(String[] pCustomArguments) 안에 JavacJavaCompilerSettings 수업.

Janino도 확인하고 싶을 수도 있습니다.

그들의 웹 사이트에서 :

Janino는 Javatm 표현식, 블록, 클래스 본문, 소스 파일 또는 소스 파일 세트를 읽고 직접로드 및 실행되는 Javatm 바이트 코드를 생성하는 컴파일러입니다. Janino는 개발 도구가 아니라 런타임 컴파일 목적을위한 임베디드 컴파일러, 예를 들어 표현 평가자 또는 JSP와 같은 "서버 페이지"엔진입니다.

http://www.janino.net/

나는 현재 꽤 큰 미션 크리티컬 프로젝트에서 그것을 사용하고 있으며 잘 작동합니다.

Javassist 당신에게 관심을 가질 수 있습니다

Tomcat과 같은 웹 컨테이너 내부에서 실행하고 먼저 JSP 페이지를 생성 한 다음 호출하십시오.

이를 통해 클래스 로더를 천천히 가득 채우지 않고 JSP 페이지를 덮어 쓸어 기존 클래스 정의를 제거 할 수 있습니다.

"메모리 인"요구 사항은 속도로 인해 또는 코드 기반을 변경하지 않아야합니까?

ECJ ECLIPSE Java 컴파일러

Eclipse는 Javac이 아닌 자체 컴파일러를 제공하고 사용합니다.

  • Eclipse 컴파일러는 IDE (Eclipse) 내에서 사용됩니다.
  • Eclipse 컴파일러는 Eclipse 외부의 순수한 배치 컴파일러로도 사용할 수 있습니다.

소스 파일을 컴파일합니다

$ java -jar ecj-3.5.2.jar HelloWorld.java

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top