我们有一个Person类:
package test;
import lombok.Data;
@Data
public abstract class Person {
private String name;
public abstract void sayHello();
}
Person类有一个抽象方法 sayHello,但是具体有哪些Person并不知道,需要配置在数据库中,然后动态进行生成Person的子类。
动态生成类工具类com.itranswarp compiler 1.0
如果是SpringBoot项目,最好加上
com.sun tools 1.8 system ${java.home}/../lib/tools.jar
工具类代码如下:
package test;
import com.itranswarp.compiler.JavaStringCompiler;
import java.util.Map;
public class CompilerUtil {
public static Class generateClass(String javaFilename, String packageName, String javaCode) throws Exception {
JavaStringCompiler compiler = new JavaStringCompiler();
String prefix = String.format("package %s;", packageName);
Map map = compiler.compile(javaFilename + ".java", prefix + "n" + javaCode);
return compiler.loadClass(packageName + "." + javaFilename, map);
}
}
动态生成类
package test;
import com.itranswarp.compiler.JavaStringCompiler;
import java.util.Map;
public class CompilerUtil {
public static Class generateClass(String javaFilename, String packageName, String javaCode) throws Exception {
JavaStringCompiler compiler = new JavaStringCompiler();
String prefix = String.format("package %s;", packageName);
Map map = compiler.compile(javaFilename + ".java", prefix + "n" + javaCode);
return compiler.loadClass(packageName + "." + javaFilename, map);
}
public static void main(String[] args) throws Exception {
String teacherCode = "public class Teacher extends Person {n" +
"n" +
" @Overriden" +
" public void sayHello() {n" +
" System.out.println("My name is " + getName() + ", I am a teacher");n" +
" }n" +
"}n";
Class teacherClass = generateClass("Teacher", "test", teacherCode);
Person person = (Person) teacherClass.newInstance();
person.setName("Tom");
person.sayHello();
}
}
My name is Tom, I am a teacher



