Java 运行时生成类

pom.xml 文件中引入

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>2.4.13</version>
</dependency>

写一个代码工具

import groovy.lang.GroovyClassLoader;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 代码工具
 *
 * @author zhangxuetu
 */
public class CodeUtils {

    /**
     * 代码转为Object
     */
    public static Object convertToObject(String code) {
        //groovy提供了一种将字符串文本代码直接转换成Java Class对象的功能
        GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
        //里面的文本是Java代码,但是我们可以看到这是一个字符串我们可以直接生成对应的Class<?>对象,而不需要我们写一个.java文件
        Class<?> clazz = groovyClassLoader.parseClass(code);
        Object obj = null;
        try {
            obj = clazz.getDeclaredConstructor().newInstance();
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            e.printStackTrace();
        }
        return obj;
    }

    /*** 调用对象的方法 */
    public static Object callMethod(Object object, String methodName, Object... args) {
        Method method = null;
        try {
            method = object.getClass().getDeclaredMethod(methodName);
            method.invoke(object, args);
            return method.getDefaultValue();
        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
    }

}

测试一下

    public static void main(String[] args) {

        Object object = CodeUtils.convertToObject("public class Hello {\n" +
                "        private String name = \"World\";\n" +
                "        private int score = 100;\n" +
                "\n" +
                "        @Override\n" +
                "        public String toString() {\n" +
                "            return \"Hello{\" +\n" +
                "                    \"name='\" + name + '\\'' +\n" +
                "                    \", score=\" + score +\n" +
                "                    '}';\n" +
                "        }\n" +
                "    }");

        System.out.println(object);

    }

参考

发表评论