本文共 4889 字,大约阅读时间需要 16 分钟。
/***CompilingClassLoader.java*Copyright 2005-2-12*/import java.io.*;public class CompilingClassLoader extends ClassLoader{ //读取一个文件的内容private byte[] getBytes(String filename) throws IOException{ File file=new File(filename); long len=file.length(); byte[] raw=new byte[(int)len]; FileInputStream fin=new FileInputStream(file); int r=fin.read(raw); if(r!=len) throw new IOException("Can't read all,"+r+"!="+len); fin.close(); return raw;}private boolean compile(String javaFile) throws IOException{ System.out.println("CCL:Compiling "+javaFile+"..."); //调用系统的javac命令 Process p=Runtime.getRuntime().exec("javac "+javaFile); try{ //其他线程都等待这个线程完成 p.waitFor(); }catch(InterruptedException ie){ System.out.println(ie); } int ret=p.exitValue(); return ret==0;}public Class loadClass(String name,boolean resovle) throws ClassNotFoundException{ Class clas=null; clas=findLoadedClass(name); //这里说明了包的表示 String fileStub=name.replace('.','/'); String javaFilename=fileStub+".java"; String classFilename=fileStub+".class"; File javaFile=new File(javaFilename); File classFile=new File(classFilename); //如果存在class文件就不编译 if(javaFile.exists()&&(!classFile.exists()||javaFile.lastModified()>classFile.lastModified())){ try{ if(!compile(javaFilename)||!classFile.exists()){ throw new ClassNotFoundException("ClassNotFoundExcetpion:"+javaFilename); } }catch(IOException ie){ throw new ClassNotFoundException(ie.toString()); } } try{ byte[] raw=getBytes(classFilename); //通过读入数据来构造一个类结构,这是核心 clas=defineClass(name,raw,0,raw.length); }catch(IOException ie){ // } if(clas==null){ clas=findSystemClass(name); } System.out.println("findSystemClass:"+clas); if(resovle && clas!=null){ resolveClass(clas); } if(clas==null){ throw new ClassNotFoundException(name); } return clas;}}测试该loader:/***TestRun.java*Copyright 2005-2-11*/import java.lang.reflect.*;public class TestRun{ public static void main(String[] args) throws Exception{ String progClass=args[0]; String progArgs[]=new String[args.length-1]; System.arraycopy(args,1,progArgs,0,progArgs.length); CompilingClassLoader ccl=new CompilingClassLoader(); Class clas=ccl.loadClass(progClass); //返回一个class的type Class[] mainArgType={(new String[0]).getClass()}; Method main=clas.getMethod("main",mainArgType); Object argsArray[]={progArgs}; main.invoke(null,argsArray); }} |
/***Hello.java*/public class Hello{ public static void main(String[] args){ if(args.length!=1){ System.err.println("Error,exit!"); System.exit(1); } String name=args[0]; System.out.println("Hello,"+name); }} |
............Hello,阿飞 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-130893/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/374079/viewspace-130893/