動態編譯java源碼

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;

相關文章
相關標籤/搜索