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