栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 运行时动态生成类(动态编译)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 运行时动态生成类(动态编译)

案例说明

我们有一个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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/435038.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号