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