千家信息网

怎么使用Java实现动态编译并动态加载

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关怎么使用Java实现动态编译并动态加载的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在D盘test目录下有个java文件:AlTest.javap
千家信息网最后更新 2026年11月03日怎么使用Java实现动态编译并动态加载

这篇文章给大家分享的是有关怎么使用Java实现动态编译并动态加载的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

在D盘test目录下有个java文件:AlTest.java

public class AlTest {         public String sayHello(){                System.out.println("AlTest类 sayHello()方法正在执行....");                return "hello word";        }}

现需要实现在工程已经运行过程中,进行java文件到class文件的编译操作,并运行AlTest类的方法

package com.piao.job; import java.lang.reflect.Method;import javax.tools.JavaCompiler;import javax.tools.ToolProvider;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Configurable;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component; @Component@Configurable@EnableSchedulingpublic class CompilerJob {   private static final Logger logger = LoggerFactory.getLogger(CompilerJob.class);   private static boolean isExecute = false;   /**   * 任务:job test   */  @Scheduled(cron = "*/10 * * * * * ")  public void test2() {    try {       if (isExecute) {         return;       }       isExecute = true;           //只是测试,所以只执行一次                                   complierAndRun();        } catch (Exception e) {           logger.error("test", e);        }  }         public void complierAndRun(){   try {                                 System.out.println(System.getProperty("user.dir"));         //动态编译         JavaCompiler javac = ToolProvider.getSystemJavaCompiler();         int status = javac.run(null, null, null, "-d", System.getProperty("user.dir")+"\target\classes","D:/test/AlTest.java");         if(status!=0){                 System.out.println("没有编译成功!");         }                                 //动态执行         Class clz = Class.forName("AlTest");//返回与带有给定字符串名的类 或接口相关联的 Class 对象。         Object o = clz.newInstance();         Method method = clz.getDeclaredMethod("sayHello");//返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法         String result= (String)method.invoke(o);//静态方法第一个参数可为null,第二个参数为实际传参         System.out.println(result);         } catch (Exception e) {                 logger.error("test", e);         }  }}

运行结果:

E:zhoufysmallpiao-admin

AlTest类 sayHello()方法正在执行....

hello word

其中代码:

int status = javac.run(null, null, null, "-d", System.getProperty("user.dir")+"\target\classes","D:/test/AlTest.java");

把class文件生成到了当前工程目录下的classes目录(E:zhoufysmallpiao-admin argetclassess)所以classloader是可以加载到的,如果想知道是哪个类加载器:

Class clz = Class.forName("AlTest");//返回与带有给定字符串名的类 或接口相关联的 Class 对象。
Object o = clz.newInstance();
System.out.println(clz.getClassLoader().getSystemClassLoader());

打印的是: sun.misc.Launcher$AppClassLoader@4e0e2f2a 说明使用的是AppClassLoader

当然也可以生成到Bootstrap ClassLoader可加载的目录下

//生成到工程classes下//int status = javac.run(null, null, null, "-d", System.getProperty("user.dir")+"\target\classes","D:/test/AlTest.java");                        //生成到BootStrap ClassLoader可加载目录下int status = javac.run(null, null, null, "-d", "C:\Program Files\Java\jdk1.8.0_65\jre\classes","D:/test/AlTest.java");

当然也可以自定义类加载器,把文件生成在指定的外部目录 :

public void complierAndRun(){                try {                                                System.out.println(System.getProperty("user.dir"));                         //动态编译                        JavaCompiler javac = ToolProvider.getSystemJavaCompiler();                        int status = javac.run(null, null, null, "-d", "D:\","D:/test/AlTest.java");                        if(status!=0){                                System.out.println("没有编译成功!");                        }                                                //动态执行                        //Class clz = Class.forName("AlTest");//返回与带有给定字符串名的类 或接口相关联的 Class 对象。                        //自定义类加载器的加载路径                        MyClassLoader myClassLoader = new MyClassLoader("D:\");                        //包名+类名                        Class clz = myClassLoader.loadClass("AlTest");                        Object o = clz.newInstance();                        Method method = clz.getDeclaredMethod("sayHello");//返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法                        String result= (String)method.invoke(o);//静态方法第一个参数可为null,第二个参数为实际传参                        System.out.println(result);                } catch (Exception e) {                        logger.error("test", e);                }        }

java动态执行代码的代码, java eval

public class ScriptUtils {         private static final Logger logger = LoggerFactory.getLogger(ScriptUtils.class);         /**     *      * 

执行字符串计算

* @param express * @param params * @return * @throws ScriptException */ @SuppressWarnings("unchecked") public static E eval(String express, Map params) throws ScriptException{ ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); if(params == null){ params = new HashMap(); } Iterator> iter = params.entrySet().iterator(); Map.Entry entry = null; while(iter.hasNext()){ entry = iter.next(); engine.put(entry.getKey(), entry.getValue()); } E result = null; try { result = (E)engine.eval(express); } catch (ScriptException e) { logger.warn("表达式执行异常: " + e.getMessage()); } return result; } /** * 解析字符串, 并将其当作表达式执行 * @param express * @param params * @return * @throws ScriptException */ public static Boolean evalBoolean(String express, Map params) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); if(params == null){ params = new HashMap(); } Iterator> iter = params.entrySet().iterator(); Map.Entry entry = null; while(iter.hasNext()){ entry = iter.next(); engine.put(entry.getKey(), entry.getValue()); } Boolean result = null; try { result = (Boolean)engine.eval(express); } catch (ScriptException e) { result = false; logger.warn("表达式执行异常: " + e.getMessage()); } return result; }

感谢各位的阅读!关于"怎么使用Java实现动态编译并动态加载"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

动态 对象 编译 方法 目录 字符 字符串 接口 文件 生成 参数 代码 工程 表达式 关联 运行 成功 内容 实际 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手磨咖啡 广州淘业互联网络科技 互联网科技公司经营范围 云信互联网科技有限公司 厦门中拓互联网络科技有限公司 互联网电商科技 腾讯阿里互联网科技 互联网络科技有限公司 上海挚品互联网科技 善班互联网科技有限公司 润盈互联网科技 广州紫鲸互联网科技 互联网科技公司有哪些 深圳国际航运科技和互联网 昭通云南众福互联网科技有限公司 花神(南京)互联网科技有限公司 链环科技传统企业怎么转型互联网 中国互联网公司排名锤子科技 互联网科技年终奖 吉林省码上互联网科技电话 互联网科技有限公司图片 互联网金融科技创新 太原新华互联网科技学校怎么样 银川新华互联网科技学校地址 青岛中康互联网医疗科技有限公司 翼展科技 首家互联网医院 互联网科技创新的路径 黑云互联网科技有限公司 21世纪互联网科技成就 领航科技大厦互联网公司
0