package com.mclon.jmxsgl.service.impl;java
import java.io.ByteArrayOutputStream;app
import java.io.File;ide
import java.io.IOException;ui
import java.io.OutputStream;this
import java.net.URI;url
import java.net.URL;spa
import java.net.URLClassLoader;.net
import java.util.ArrayList;orm
import java.util.Enumeration;get
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.tools.Diagnostic;
import javax.tools.FileObject;
import javax.tools.ForwardingJavaFileManager;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
* 動態編譯代碼類
* @author zhangxu
public class DynamicEngine {
public static DynamicEngine getInstance() {
return new DynamicEngine();
private URLClassLoader parentClassLoader;
private DynamicEngine() {
this.parentClassLoader = (URLClassLoader) this.getClass()
.getClassLoader();
this.buildClassPath();
private void buildClassPath() {
if (classpath == null) {
StringBuilder sb = new StringBuilder();
Map<String, String> filePath = new HashMap<String, String>();
// 讀取容器lib
try {
Enumeration<URL> urls = Thread.currentThread()
.getContextClassLoader().getResources(".");
String tomPath = urls.nextElement().getPath();
File file = new File(tomPath);
if (file.isDirectory()) {
File[] fList = file.listFiles();
for (int j = 0; j < fList.length; j++) {
if (fList[j].isFile()
&& (fList[j].getName().contains(".jar"))) {
fList[j].getPath();
filePath.put(fList[j].getName(),
tomPath + fList[j].getName());
} else if (file.getName().contains(".jar")) {
} catch (Exception e) {
System.out.println("Error: " + e);
// 讀取工程lib
for (URL url : this.parentClassLoader.getURLs()) {
String p = url.getFile();
File file = new File(url.toString());
String fileName = file.getName();
filePath.put(fileName, p);
// 組裝classpath
sb.append(filePath.get(key)).append(File.pathSeparator);
System.out.println(sb.toString());
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,
boolean success = task.call();
if (success) {
JavaClassObject jco = fileManager.getJavaClassObject();
DynamicClassLoader dynamicClassLoader = new DynamicClassLoader( this.parentClassLoader);http://www.huiyi8.com/moban/ 網頁模板
Class clazz = dynamicClassLoader.loadClass(fullClassName, jco);
instance = clazz.newInstance();
} else {
String error = "";
for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
error = error + compilePrint(diagnostic);
long end = System.currentTimeMillis();
System.out.println("javaCodeToObject use:" + (end - start) + "ms");
return instance;