Java 运行时动态生成类(动态编译)
案例说明
我们有一个Person类:
package test; import lombok.Data; @Data public abstract class Person { private String name; public abstract void sayHello(); }
Person类有一个抽象方法 sayHello,但是具体有哪些Person并不知道,需要配置在数据库中,然后动态进行生成Person的子类。
动态生成类工具类
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.4.13</version> </dependency>
工具类代码如下:
package test; import groovy.lang.GroovyClassLoader; public class CompilerUtil { public static Class generateClass(String javaFilename, String packageName, String javaCode) throws Exception { GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); String prefix = String.format("package %s;", packageName); return groovyClassLoader.parseClass(prefix + " " + javaCode); } }
动态生成类示例
package test; import groovy.lang.GroovyClassLoader; public class CompilerUtil { public static Class generateClass(String javaFilename, String packageName, String javaCode) throws Exception { GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); String prefix = String.format("package %s;", packageName); return groovyClassLoader.parseClass(prefix + " " + javaCode); } public static void main(String[] args) throws Exception { String teacherCode = "public class Teacher extends Person { " + " " + " @Override " + " public void sayHello() { " + " System.out.println("My name is " + getName() + ", I am a teacher"); " + " } " + "} "; Class teacherClass = generateClass("Teacher", "test", teacherCode); Person person = (Person) teacherClass.newInstance(); person.setName("Tom"); person.sayHello(); } }
输出:
My name is Tom, I am a teacher
上一篇:
IDEA上Java项目控制台中文乱码