动态生成java、动态编译、动态加载

我曾经见过一个“规则引擎”,是在应用系统web界面直接编写java代码,然后保存后,规则即生效,我一直很是奇怪,这是如何实现的呢?实际这就好像jsp,被中间件动态的编译成java文件,有被动态的编译成class,同时又动态的加载到classloader中。所以,本质上,纯java得规则引擎,是100%可以实现的。

1、动态生成java源代码。这个过程太过简单,直接略过。

2、动态编译。

我看我们自己的规则引擎也有动态编译,就是在生成BOM模型的时候。但是是调用Process执行javac。但这种方式坦白来说不好。因为javac,的命令参数写法和操作系统有关,也就是windows和linux的写法有少量不同。后来发现jdk提供一个动态编译的类。

JavaCompiler javac;

javac = ToolProvider.getSystemJavaCompiler();

int compilationResult = javac.run(null,null,null, "-g","-verbose",javaFile);

这样就可以动态进行编译。前两个参数是输入参数、输出参数,我觉得没有什么用,第三个参数是编译输出信息,默认输出到System.out.err里面。从第四个参数开始,就是javac的参数,可以用数组,也可以直接逗号分割。

3、动态加载。

动态加载实际就是调用ClassLoader。当然需要反射机制调用其中的一个内部分方法,使之变成外部可调用的方法。

File file = new File("/Users/yangming/Work/DevWorkSpace/ssac/gx_hx/test/"); URLClassLoader classloader = (URLClassLoader) ClassLoader.getSystemClassLoader();

Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});

add.setAccessible(true);

add.invoke(classloader, new Object[]{file.toURI().toURL()});

Class c = classloader.loadClass("Test");

Object o = c.newInstance();

Method m = c.getDeclaredMethod("getString");

m.invoke(o, null);

这样就完成了类的动态加载。

时间: 2024-10-11 12:57:31

动态生成java、动态编译、动态加载的相关文章

jvm内存模型,java类从编译到加载到执行的过程,jvm内存分配过程

一.jvm内存模型 JVM 内存模型主要分为堆.程序计数器.方法区.虚拟机栈和本地方法栈 1.堆 1.1.堆是 JVM 内存中最大的一块内存空间. 1.2.该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中. 1.3.堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成. 2.程序计数器(Program Counter Register) 程序计数器是一块很小的内存

Silverlight系列--动态生成DataGrid列 根据动态列绑定Dictionary数据

1.获取表头数据源动态生成DataGrid表头 DataGridTextColumn d = new DataGridTextColumn(); d.Header = itemPriceClass.PriceKindCode + itemPriceClass.PriceKindName; Binding bin = new Binding(); bin.Converter = new RowIndexConverter(); bin.ConverterParameter = itemPriceC

Java--自定义Class并且在内存中编译,加载,实例化

本文的目的: 使用者在程序运行期间,可以动态的写Java Class,不需要生成任何.Class文件就可以完全在内存中编译,加载,实例化. 1.需要用到的组件介绍 1)JavaCompiler:用于编译Java Code. 2)CharSequenceJavaFileObject:用于保存Java Code,提供方法给JavaCompiler获取String形式的Java Code. 3)ClassFileManager:用于JavaCompiler将编译好后的Class文件保存在指定对象中.

《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?

Java虚拟机是如何加载Java类的?  这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. tonight ! 我们把它映射到实战里,看看如何用代码说明这个流程. ready! go!  ----------------在这之前还是搞点理论吧,不然又要先去百度加载机制流程了. 一.类加载机制(理论部分) 类加载机制有三大过程:加载.链接.初始化.其中链接又细分为验证.准备及解析. Java

java 自定义类的加载器

首先介绍自定义类的应用场景: (1)加密:Java代码可以轻易的被反编译,如果你需要把自己的代码进行加密以防止反编译,可以先将编译后的代码用某种加密算法加密,类加密后就不能再用Java的ClassLoader去加载类了,这时就需要自定义ClassLoader在加载类的时候先解密类,然后再加载. (2)从非标准的来源加载代码:如果你的字节码是放在数据库.甚至是在云端,就可以自定义类加载器,从指定的来源加载类. (3)以上两种情况在实际中的综合运用:比如你的应用需要通过网络来传输 Java 类的字节

好程序员Java学习路线分享Java面试题之加载机制

好程序员Java学习路线分享Java面试题之加载机制,面试场景:面试官第一问:请问,我现在编写一个类,类全名如下:java.lang.String,我们知道JDK也给我们听过了一个java.lang.String,那么,我们编写的这个String类能否替换到JDK默认提供,也就是说程序实际运行的时候,会加载我们的String还是JDK的String?为什么?如果,你无法确定?那么第二问:了解类的加载机制吗?知道JDK的类加载器吗?双亲委托机制说说看如果,你还不了解,那么我们聊聊今天的天气吧!1,

Java 类加载器及加载Class字节码

参考来源:http://www.cnblogs.com/fingerboy/p/5456371.html       java笔记--理解java类加载器以及ClassLoader类 参考来源:http://blog.csdn.net/shareus/article/details/52422788    Java 类加载器及加载Class字节码

未知的生成错误 因为没有预加载,所以无法解析程序集 GalaSoft.MvvmLight

使用wpf开发时,在ViewModel中引用了DevExpress注册的GalaSoft.MvvmLight命名空间,使用其ViewModelBase,在View界面中绑定事件时出现错误: 错误 13 未知的生成错误"因为没有预加载,所以无法解析程序集"GalaSoft.MvvmLight, Version=5.3.0.27409, Culture=neutral, PublicKeyToken=0e453835af4ee6ce"的依赖项.在使用 ReflectionOnly

java web 项目如何加载log4j配置文件

在整个WEB系统中,为了统一的使用日志管理,需要在系统启动的时候就加载Log4j的配置文件,这样才能保证以后使用log4j的格式是一致的,便于跟踪和解决问题. 那么,如何在系统启动的时候加载log4j的配置文件呢?下面我简单的介绍一下: 1.在web.xml文件中添加一个"监听器" Xml代码 <!-- 加载log4j的配置信息 --> <listener> <listener-class>hb.init.log4j.Log4jInit</li