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