快速业务通道

初探Java类加载机制的奥秘 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-07-04
ader.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);  } }

以上的核心内容已经编写完了,编译后,我们得到两个文件:

CompilingClassLoader.class,TestRun.class

四、编写一个例子,然后运行我们的ClassLoader

/** *Hello.java */ public class Hello{  public static void main(String[] args){   if(args.length!=1){    System.err.println("Error,exit!");    S

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号