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

你可能感兴趣的:(java基础)