> Java > java지도 시간 > JavaCompiler를 사용하여 외부 Java 클래스를 동적으로 컴파일하고 로드하는 방법은 무엇입니까?

JavaCompiler를 사용하여 외부 Java 클래스를 동적으로 컴파일하고 로드하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-15 21:33:10
원래의
341명이 탐색했습니다.

How to Dynamically Compile and Load External Java Classes using JavaCompiler?

외부 Java 클래스를 동적으로 컴파일하고 로드하는 방법

사용자가 플러그인을 통해 기능을 사용자 정의할 수 있는 프로그램을 만들 때 다음 사항이 필수적입니다. 외부 Java 클래스를 컴파일하고 로드하는 기능. 이를 달성하는 방법에 대한 포괄적인 가이드는 다음과 같습니다.

JavaCompiler 사용

동적 컴파일의 경우 JavaCompiler 클래스를 활용하세요. 다음은 JavaDocs를 기반으로 한 예입니다.

import javax.tools.*;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DynamicCompilation {

    public static void main(String[] args) {
        // Write the class to a file
        File helloWorldJava = new File("testcompile/HelloWorld.java");
        ...

        // Compile the file
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);

        // Set the classpath
        List<String> optionList = new ArrayList<>();
        optionList.add("-classpath");
        optionList.add(System.getProperty("java.class.path") + File.pathSeparator + "dist/InlineCompiler.jar");

        Iterable<? extends JavaFileObject> compilationUnit = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(helloWorldJava));
        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null, compilationUnit);

        if (task.call()) {
            // Load and execute the compiled class
            URLClassLoader classLoader = new URLClassLoader(new URL[]{new File("./").toURI().toURL()});
            Class<?> loadedClass = classLoader.loadClass("testcompile.HelloWorld");
            Object obj = loadedClass.newInstance();
            if (obj instanceof DoStuff) {
                DoStuff stuffToDo = (DoStuff) obj;
                stuffToDo.doStuff();
            }
        } else {
            ...
        }
        fileManager.close();
    }

    public static interface DoStuff {

        public void doStuff();
    }

}
로그인 후 복사

이 코드는 Java 파일을 생성하고 JavaCompiler를 사용하여 컴파일하고 사용자 정의 ClassLoader를 사용하여 컴파일된 클래스를 로드 및 실행하는 방법을 보여줍니다. 이 예에는 컴파일러용 ClassPath가 포함되어 있습니다.

추가 리소스

  • [JavaCompiler API](https://docs.oracle.com/javase/7/docs/api/javax/tools/JavaCompiler.html)
  • [ClassLoader API](https://docs.oracle.com/ javase/7/docs/api/java/lang/ClassLoader.html)

위 내용은 JavaCompiler를 사용하여 외부 Java 클래스를 동적으로 컴파일하고 로드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿