java動態編譯

java動態編譯一部分代碼

javaCode:


import lombok.AllArgsConstructor;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.*;
import java.lang.reflect.Method;

@AllArgsConstructor
public class CompilerTest extends ClassLoader {


    String filePath;

    @Override
    protected Class<?> findClass(String name){
        File file = new File(filePath);
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] bytes = new byte[1024];
        int len=0;
        while (true){
            try {
                if (!((len = fileInputStream.read(bytes))!=-1)) break;
            } catch (IOException e) {
                e.printStackTrace();
            }
            byteArrayOutputStream.write(bytes,0,len);
        }
        Class<?> helloWorld = this.defineClass("HelloWorld", byteArrayOutputStream.toByteArray(), 0, byteArrayOutputStream.size());
        return helloWorld;
    }

    public static void main(String[] args) throws Exception {
        String hh = "public class HelloWorld {\n" +
                "    public void sayHello(){\n" +
                "        System.out.println(\"hello World\");\n" +
                "    }\n" +
                "}";
        String fileName = "D:\\document\\HelloWorld.java";
        FileOutputStream fileOutputStream = new FileOutputStream(fileName);
        fileOutputStream.write(hh.getBytes("UTF-8"));
        fileOutputStream.flush();
        fileOutputStream.close();
        //拿到java編譯器
        JavaCompiler systemJavaCompiler = ToolProvider.getSystemJavaCompiler();
        //編譯文件系統
        StandardJavaFileManager standardFileManager = systemJavaCompiler.getStandardFileManager(null, null, null);
        Iterable<? extends JavaFileObject> javaFileObjects = standardFileManager.getJavaFileObjects(fileName);
        Boolean call = systemJavaCompiler.getTask(null, standardFileManager, null, null, null, javaFileObjects).call();
        //如果沒編譯成功
        if(!call)  return;
        CompilerTest compilerTest = new CompilerTest(fileName.replace("java","class"));
        Class<?> aClass = compilerTest.findClass(null);
        Method sayHello = aClass.getMethod("sayHello");
        sayHello.invoke(aClass.newInstance());
    }


}

結果:

hello World

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章