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项目控制台中文乱码
