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
经验分享 程序员 微信小程序 职场和发展