java内存动态编译执行

1.package org.jui.core.dynamic;
public class DynaCompTest {
public static void main(String[] args) throws Exception {
String fullName = "DynaClass";
StringBuilder src = new StringBuilder();
src.append("public class DynaClass {\n");
src.append(" public String toString() {\n");
src.append(" return \"Hello, I am \" + ");
src.append("this.getClass().getSimpleName();\n");
src.append(" }\n");
src.append("}\n");

System.out.println(src);
DynamicEngine de = DynamicEngine.getInstance();
Object instance = de.javaCodeToObject(fullName,src.toString());
System.out.println(instance);
2.package org.jui.core.dynamic;

import javax.tools.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.net.URL;
import java.net.URLClassLoader;
import java.io.File;

public class DynamicEngine {
private static DynamicEngine ourInstance = new DynamicEngine();

public static DynamicEngine getInstance() {
return ourInstance;
}
private URLClassLoader parentClassLoader;
private String classpath;
private DynamicEngine() {
this.parentClassLoader = (URLClassLoader) this.getClass().getClassLoader();
this.buildClassPath();
}
private void buildClassPath() {
this.classpath = null;
StringBuilder sb = new StringBuilder();
for (URL url : this.parentClassLoader.getURLs()) {
String p = url.getFile();
sb.append(p).append(File.pathSeparator);
}
this.classpath = sb.toString();
}
public Object javaCodeToObject(String fullClassName, String javaCode) throws IllegalAccessException, InstantiationException {
long start = System.currentTimeMillis();
Object instance = null;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(diagnostics, null, null));

List<JavaFileObject> jfiles = new ArrayList<JavaFileObject>();
jfiles.add(new CharSequenceJavaFileObject(fullClassName, javaCode));
List<String> options = new ArrayList<String>();
options.add("-encoding");
options.add("UTF-8");
options.add("-classpath");
options.add(this.classpath);

JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, options, null, jfiles);
boolean success = task.call();

if (success) {
JavaClassObject jco = fileManager.getJavaClassObject();
DynamicClassLoader dynamicClassLoader = new DynamicClassLoader(this.parentClassLoader);
Class clazz = dynamicClassLoader.loadClass(fullClassName,jco);
instance = clazz.newInstance();
} else {http://www.huiyi8.com/jiaoben/
String error = ""; javascript特效
for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
error = error + compilePrint(diagnostic);
long end = System.currentTimeMillis();
System.out.println("javaCodeToObject use:"+(end-start)+"ms");
return instance;
private String compilePrint(Diagnostic diagnostic) {
System.out.println("Code:" + diagnostic.getCode());
System.out.println("Kind:" + diagnostic.getKind());
System.out.println("Position:" + diagnostic.getPosition());
System.out.println("Start Position:" + diagnostic.getStartPosition());
System.out.println("End Position:" + diagnostic.getEndPosition());
System.out.println("Source:" + diagnostic.getSource());
System.out.println("Message:" + diagnostic.getMessage(null));
System.out.println("LineNumber:" + diagnostic.getLineNumber());
System.out.println("ColumnNumber:" + diagnostic.getColumnNumber());
StringBuffer res = new StringBuffer();
res.append("Code:[" + diagnostic.getCode() + "]\n");
res.append("Kind:[" + diagnostic.getKind() + "]\n");
res.append("Position:[" + diagnostic.getPosition() + "]\n");
res.append("Start Position:[" + diagnostic.getStartPosition() + "]\n");
res.append("End Position:[" + diagnostic.getEndPosition() + "]\n");
res.append("Source:[" + diagnostic.getSource() + "]\n");
res.append("Message:[" + diagnostic.getMessage(null) + "]\n");
res.append("LineNumber:[" + diagnostic.getLineNumber() + "]\n");
res.append("ColumnNumber:[" + diagnostic.getColumnNumber() + "]\n");
return res.toString();
3.package org.jui.core.dynamic;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import java.net.URI;

public class CharSequenceJavaFileObject extends SimpleJavaFileObject {
private CharSequence content;
public CharSequenceJavaFileObject(String className,
CharSequence content) {
super(URI.create("string:///" + className.replace(‘.‘, ‘/‘)
+ JavaFileObject.Kind.SOURCE.extension), JavaFileObject.Kind.SOURCE);
this.content = content;
@Override
public CharSequence getCharContent(
boolean ignoreEncodingErrors) {
return content;
4.package org.jui.core.dynamic;

import javax.tools.*;
import java.io.IOException;
import java.security.SecureClassLoader;

public class ClassFileManager extends
ForwardingJavaFileManager {
public JavaClassObject getJavaClassObject() {
return jclassObject;
private JavaClassObject jclassObject;
public ClassFileManager(StandardJavaFileManager
standardManager) {
super(standardManager);
@Override
public JavaFileObject getJavaFileForOutput(Location location,
String className, JavaFileObject.Kind kind, FileObject sibling)
throws IOException {
jclassObject = new JavaClassObject(className, kind);
return jclassObject;

java内存动态编译执行,布布扣,bubuko.com

时间: 2024-10-23 06:25:03

java内存动态编译执行的相关文章

java的动态编译功能

import javax.tools.JavaCompiler; import javax.tools.ToolProvider; /** * java的动态编译 * @author Administrator * */ public class Demo04 { public static void main(String[] args) { JavaCompiler compiler=ToolProvider.getSystemJavaCompiler(); int result = com

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

我曾经见过一个“规则引擎”,是在应用系统web界面直接编写java代码,然后保存后,规则即生效,我一直很是奇怪,这是如何实现的呢?实际这就好像jsp,被中间件动态的编译成java文件,有被动态的编译成class,同时又动态的加载到classloader中.所以,本质上,纯java得规则引擎,是100%可以实现的. 1.动态生成java源代码.这个过程太过简单,直接略过. 2.动态编译. 我看我们自己的规则引擎也有动态编译,就是在生成BOM模型的时候.但是是调用Process执行javac.但这种

JAVA之动态编译

通过Java动态生成class文件 今天说下JAVA中的动态编译,这个功能根据我现在的了解好像没有见到过用的,我Jio的吧,现在的一些在线代码编缉器可以用到了,这个具体我也不是很清楚.感兴趣的大家可以自已了解下. 说到动态编缉大家可能会想到,动态编缉肯定不是像我们平时运行程序似的在本地的平台就开始编译了. 动态编译其实是在程序的运行过程中对Java文件的编译或者是运行.class的文件.比如说我今天想装一波,我写个java的程序,又写了个另一个java的程序在小伙伴面秀,我只运行一个java程序

Java程序动态编译Java源文件

最近接触到公司一个项目,需要将生成的源码动态编译,记录下学习过程. 先贴出官网推荐写法: JavaCompiler.CompilationTask getTask(Writer out,                                     JavaFileManager fileManager,                                     DiagnosticListener<? super JavaFileObject> diagnosticL

Java命令与编译执行

一.最基础的编译运行: 在D盘根目录下进行测试: public class Test{ public void say(){ System.out.println("ok"); } public static void main(String[]args){ new Test().say(); } } 以上代码写入: d:\Test.java 然后在d盘目录下执行: D:\ >javac Test.java 便能生产Test.class文件,文件同样位于D:\根目录下 再执行:

linux编译执行java工程

一,java环境在linux上的安装 wget http://10.100.51.30:8080/software/jdk-7u71-linux-x64.rpm rpm -ivh jdk-7u71-linux-x64.rpm 安装好后试试  java -v 如果有打印出jdk的版本号,代表安装成功 二  maven在linux上的安装 AC=`ls /opt/maven|wc -l` if [[ $AC -eq 0 ]];then cd /opt wget -q http://10.100.51

java内存理解与优化

篇幅较长预警 为了方便解释java内存机制,先从类的加载开始谈起 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个类被"首次主动使用"时再加载它(Java首先是通

编译执行与解释执行的区别

解释执行 由解释器根据输入的数据当场执行而不生成任何目标程序. 解释执行程序是高级语言翻译程序的一种,它将源语言(如VASIC)书写的源程序作为输入,解释一句后就提交给计算机执行一句,并不生成目标程序.这种工作方式非常适合于人通过终端设备与计算机会话,如在终端上打一条命令或者语句, 解释程序就立即将此语句解释成一条或几条指令并提交硬件立即执行且将执行结果反映到终端,从终端把命令打入后,就能立即得到计算结果.这的确很方便,很适合于一些小型机的计算问题,但解释执行速度很慢,例如源程序中出现循环, 则

java动态编译类文件并加载到内存中

如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考笔者的这篇博文-(该博文暂未发布) 所谓动态编译,就是在程序运行时产生java类,并编译成class文件. 一.这里介绍两种动态编译java文件的方式. 第一种:使用Runtime执行javac命令 /** * 编译java类 * 使用Runtime执行javac命令 * @param name 类的全限定包名 不带后缀 例如com.test.Notice 而不要写成com.