`

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

    博客分类:
  • 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);
这样就完成了类的动态加载。
分享到:
评论

相关推荐

    java动态编译指定java文件且将java文件生成jar

    本教程将深入讲解如何实现这个过程,主要关注`java动态编译`和`将class生成jar`这两个关键步骤,同时会涉及到`JavaCompiler` API的使用。 首先,让我们了解`JavaCompiler` API。这是Java标准库中的一部分,位于`...

    Java动态生成代码并编译载入

    Java动态生成代码并编译载入是Java编程中的一项高级技术,它允许程序在运行时创建新的类或接口,然后即时编译并加载到当前的Java虚拟机(JVM)中。这种技术主要依赖于Java的反射API和Java的编译器API(javac)或者更...

    利用Java的动态编译、动态加载结合EasyRules实现业务规则的动态性的项目源码

    利用Java的动态编译、动态加载结合EasyRules实现业务规则的动态性的项目源码,具体详情请查看相关博客https://blog.csdn.net/qq_31142553/article/details/85013989

    动态生成、编译、运行java文件

    首先,动态生成Java代码通常涉及到字符串或模板引擎。开发者可以使用字符串变量来构造Java源代码,并将其存储为字符串对象。例如,我们可以用StringBuilder或StringBuffer类来拼接代码片段。此外,还可以使用模板...

    Java动态生成代码并编译载入.pdf

    2. 创建源代码文件:根据模板文件和给定的数据动态生成Java源代码文件,并将这些文件放置在源文件目录(src目录)。 3. 编译源代码文件:使用Java编译器(如javac)对源代码文件进行编译,将它们编译成.class字节码...

    动态编译字符串成java,并且添加class到jvm

    在Java编程中,动态编译字符串成Java代码并将其加载到JVM(Java虚拟机)是一种高级技巧,常用于运行时代码生成、元编程或插件系统等场景。这一技术的核心在于利用Java的反射API和Java Compiler API。下面将详细阐述...

    动态编译、加载java类

    在Java编程中,动态编译和加载类是一种高级特性,它允许程序在运行时编译源代码并将其加载到Java虚拟机(JVM)中。这种能力对于开发灵活性高、可扩展性强的应用程序非常有用,比如在服务器端处理动态生成的代码、...

    Java语言-动态编译代码并热加载类

    在Java编程中,动态编译代码并热加载类是一项重要的技术,它允许程序在运行时修改或添加新的类,而无需重启应用。这种能力对于快速迭代开发、调试和性能优化非常有用。本主题将深入探讨Java中的动态编译与热加载机制...

    java 动态编译打包 动态编译可以用于实现动态代码生成、动态加载、插件化等功能

    Java 动态编译打包是Java开发中的一个重要技术,它允许程序在运行时生成和编译源代码,然后即时加载到应用程序中。这种技术在许多场景下都非常有用,例如实现动态代码生成、动态加载和插件化系统。下面将详细讨论...

    java动态编译java源文件

    Java动态编译指的是在程序运行时将Java源代码编译为字节码并加载到Java虚拟机(JVM)中的过程。这种技术在许多场景下非常有用,例如在开发环境中进行快速迭代、AOP(面向切面编程)或运行时代码生成等。Java的`javax...

    java 动态编译.java文件,动态运行类

    6. **运行编译后的类**:如果编译成功,我们可以使用`ClassLoader`加载新生成的类并实例化。注意,类加载器应指向编译输出的目录。 ```java URLClassLoader classLoader = new URLClassLoader(new URL[]{new File(...

    java 动态编译.java文件,动态运行类 _1.3

    在Java编程中,动态编译和运行类是一项重要的技术,特别是在需要实时更新代码或实现热部署的场景下。本文将详细讲解如何在Java中实现动态编译.java源代码文件并执行编译后的类。 首先,我们需要理解Java的编译过程...

    java 动态编译.java文件,动态运行类 _1.2

    1. **Java编译API:Javacompiler接口** Java提供了一个内置的`javax.tools.JavaCompiler`接口,它是Java工具接口(Java Tool API)的一部分,允许我们在程序中调用Javac编译器。要使用这个接口,首先需要引入`tools...

    java .class反编译成.java工具

    在Java编程中,程序员编写的是.java源代码文件,这些文件经过Java编译器(javac)编译后,会生成对应的.class文件,这是Java虚拟机(JVM)能够执行的二进制格式。然而,由于编译过程会丢弃源代码信息,.class文件...

    Java调用Groovy,实时动态加载数据库groovy脚本

    Groovy代码可以被Java编译器理解,并且在运行时,GroovyShell或GroovyClassLoader等工具能够即时编译和执行Groovy脚本,这为动态加载和执行提供了便利。 当我们需要在Java程序中调用Groovy脚本时,可以使用以下步骤...

    在java中利用动态编译实现eval

    然而,通过使用Java的反射API和动态编译技术,可以实现类似的功能。动态编译是指在程序运行时将源代码编译成字节码并加载到JVM中执行,这在某些场景下可以极大地提高代码的灵活性。 首先,让我们理解`eval`的基本...

    JUN SpringBoot API Service 是一个基于SpringBoot+Groovy+SQL动态生成API

    支持在线编辑写好SQL或者Java源码、Groovy源码、Python源码(TODO),JavaScript源码(TODO)、Shell脚本,后即可快速生成Rest接口对外提供服务,同时支持服务在线热加载在线编辑替换逻辑,还将提供了一键生成CRUD...

    java程序中加载动态链接库文件

    5. **加载动态链接库**:在Java程序中使用`System.loadLibrary()`或`Runtime.loadLibrary()`方法加载编译好的动态链接库。例如: ```java System.loadLibrary("MyLib"); ``` 或者直接指定动态链接库的路径: ...

    Java6内存中动态编译案例

    java6提供标准包javax.tools操作Java编译器,本例实现在内存动态编译java代码,并加载动态生成类 执行 console: public class HelloWorld { public static void main(String args[]) { System.out.println("Hello...

    防止Java程序被反编译

    7. **动态代码生成**:在运行时动态生成和执行代码,减少静态Class文件的数量,提高反编译的复杂度。 8. **使用专有库和API**:依赖于非公开的库或API,增加他人理解和复用代码的难度。 9. **代码审计和安全策略**...

Global site tag (gtag.js) - Google Analytics