java内存动态编译_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 diagnostics = new DiagnosticCollector();

ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(diagnostics, null, null));

List jfiles = new ArrayList();

jfiles.add(new CharSequenceJavaFileObject(fullClassName, javaCode));

List options = new ArrayList();

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;

原文:http://www.cnblogs.com/cjings/p/3867933.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值