67,549
社区成员




package org.firewater.compile_code;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
public class FireWaterClassLoader extends ClassLoader {
private File classPathFile;
public FireWaterClassLoader(){
String classPath = FireWaterClassLoader.class.getResource("").getPath();
this.classPathFile = new File(classPath);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String className = FireWaterClassLoader.class.getPackage().getName() + "." + name;
if(classPathFile != null){
File classFile = new File(classPathFile,name.replaceAll("\\.","/") + ".class");
if(classFile.exists()){
FileInputStream in = null;
ByteArrayOutputStream out = null;
try{
in = new FileInputStream(classFile);
out = new ByteArrayOutputStream();
byte [] buff = new byte[1024];
int len;
while ((len = in.read(buff)) != -1){
out.write(buff,0,len);
}
return defineClass(className,out.toByteArray(),0,out.size());
}catch (Exception e){
e.printStackTrace();
}
}
}
return null;
}
}
package org.firewater.compile_code;
/*
* 类需要实现的接口
* */
public interface ClassInterface {
public int add();
public void printString();
}
package org.firewater.compile_code;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class InitClass {
private static String crlf="\r\n";
public static String generatorCode(){
StringBuffer sb=new StringBuffer();
sb.append("package org.firewater.compile_code;").append(crlf);
sb.append("public class SimpleClass1 implements ClassInterface{").append(crlf)
.append("private int a;").append(crlf)
.append("private int b;").append(crlf)
.append("private String c;").append(crlf)
.append("public SimpleClass1(int a, int b, String c) {").append(crlf)
.append("this.a = a;").append(crlf)
.append("this.b = b;").append(crlf)
.append("this.c = c;").append(crlf)
.append("}").append(crlf)
.append("public int add(){").append(crlf)
.append("int d=this.a+this.b;").append(crlf)
.append("System.out.println(\"d====:“\"+d+\"”\");").append(crlf)
.append(" return d;").append(crlf)
.append("}").append(crlf)
.append("public void printString(){").append(crlf)
.append("System.out.println(\"c====:“\"+c+\"”\");").append(crlf)
.append("}").append(crlf)
.append("}").append(crlf);
return sb.toString();
}
public static Object newObjectInstance() throws IOException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException, NoSuchMethodException {
//生成Java 源码
String code = generatorCode();
//输出到磁盘
String filePath = InitClass.class.getResource("").getPath();
File f = new File(filePath + "SimpleClass1.java");
FileWriter fw = new FileWriter(f);
fw.write(code);
fw.flush();
fw.close();
//编译成class
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager manage = compiler.getStandardFileManager(null,null,null);
Iterable iterable = manage.getJavaFileObjects(f);
JavaCompiler.CompilationTask task = compiler.getTask(null,manage,null,null,null,iterable);
task.call();
manage.close();
//使用类加载机制加载class
FireWaterClassLoader classLoader=new FireWaterClassLoader();
Class clazz = classLoader.findClass("SimpleClass1");
Constructor c = clazz.getConstructor(int.class,int.class,String.class);
f.delete();
Object o = c.newInstance(1, 2,"3333");
return o;
}
}
package org.firewater.compile_code;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
public class TestMain {
public static void main(String[] args) {
try {
ClassInterface classInterface=(ClassInterface)InitClass.newObjectInstance();
classInterface.add();
classInterface.printString();
} catch (IOException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}