《Java知识应用》Java 动态生成对象实例

前言

工作中经常需要动态生成Java对象进行操作。

下载

百度云链接: https://pan.baidu.com/s/1vqJvIg6zBWppNrB68OdfAw 提取码: t6qk

案例

public class CompilerDemo {

    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));" +
                "}" +
                "}";
        run(source, "1", "2");
    }



    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});
    }
}

运行结果:

总结

动态生成对象还有其他方法。

posted @ 2021-01-08 11:35  加速丨世界  阅读(246)  评论(0编辑  收藏  举报