Java动态编译String字符串到Class对象

该案例是模拟:Java在线编译

第一步:导入Maven依赖

<dependency>
    <groupId>com.itranswarp</groupId>
    <artifactId>compiler</artifactId>
    <version>1.0</version>
</dependency>

第二步:写执行方法

public class StringCompiler {
    
    

    public static Object run(String source, String...args) throws Exception {
    
    
        // 声明类名
        String className = "Main";
        String packageName = "top.fomeiherz";
        // 声明包名:package top.fomeiherz;
        String prefix = String.format("package %s;", packageName);
        // 全类名:top.fomeiherz.Main
        String fullName = String.format("%s.%s", packageName, className);
        
        // 编译器
        JavaStringCompiler compiler = new JavaStringCompiler();
        // 编译:compiler.compile("Main.java", source)
        Map<String, byte[]> results = compiler.compile(className + ".java", prefix + source);
        // 加载内存中byte到Class<?>对象
        Class<?> clazz = compiler.loadClass(fullName, results);
        // 创建实例
        Object instance = clazz.newInstance();
        Method mainMethod = clazz.getMethod("main", String[].class);
        // String[]数组时必须使用Object[]封装
        // 否则会报错:java.lang.IllegalArgumentException: wrong number of arguments
        return mainMethod.invoke(instance, new Object[]{
    
    args});
    }
    
}

第三步:编写测试类

public class StringCompilerTest {
    
    

    public static void main(String[] args) throws Exception {
    
    
        // 传入String类型的代码
        String source = "import java.util.Arrays;public class Main" +
                "{" +
                "public static void main(String[] args) {" +
                "System.out.println(Arrays.toString(args));" +
                "}" +
                "}";
        StringCompiler.run(source, "1", "2");
    }
    
}

源码地址:https://gitee.com/pachira/java-compiler

猜你喜欢

转载自blog.csdn.net/fomeiherz/article/details/104373086
今日推荐