加入收藏 收藏网站 设为首页 设为首页
招生考试网
学历类| 阳光高考 研 究 生 自学考试 成人高考 专 升 本 中考会考 外语类| 四 六 级 职称英语 商务英语 公共英语 日语能力
资格类| 公 务 员 报 关 员 银行从业 司法考试 导 游 证 教师资格 财会类| 会 计 证 经 济 师 会计职称 注册会计 税 务 师
工程类| 一级建造 二级建造 造 价 师 造 价 员 咨 询 师 监 理 师 医学类| 卫生资格 执业医师 执业药师 执业护士 国际护士
计算机| 等级考试 软件水平 应用能力 其它类| 书画等级 美国高考 驾 驶 员 书法等级 少儿英语 报 检 员 单 证 员 出国留学
 招生考试网 - 计算机等级考试 - 考试辅导 - 正文

 
Java类加载原理
来源:fjzsksw.com 2009-12-24 编辑:yangmeiling 【字体:小 大】
Java类加载原理

// 类加载器的核心代码 -加载类在需要的时候自动编译源文件。

  public Class loadClass( String name, boolean resolve )

  throws ClassNotFoundException {

  //我们的目的是获得一个类对象。

  Class clas = null;

  // 首先,检查是否已经出理过这个类。

  clas = findLoadedClass( name );

  //System.out.println( "findLoadedClass: "+clas );

  // 通过类名获得路径名 比如:java.lang.Object => java/lang/Object

  String fileStub = name.replace( '.', '/' );

  // 构建指向源文件和类文件的对象。

  String javaFilename = fileStub+".java";

  String classFilename = fileStub+".class";

  File javaFile = new File( javaFilename );

  File classFile = new File( classFilename );

  //System.out.println( "j "+javaFile.lastModified()+" c "

  //+classFile.lastModified() );

  // 首先,判断是否需要编译。如果源文件存在而类文件不存在,或者都存在,但是源文件

  // 较新,说明需要编译。

  if (javaFile.exists() &&(!classFile.exists() ||

  javaFile.lastModified() > classFile.lastModified())) {

  try {

  // 编译,如果编译失败,我们必须声明失败原因(仅仅使用陈旧的类是不够的)。

  if (!compile( javaFilename ) || !classFile.exists()) {

  throw new ClassNotFoundException( "Compile failed: "+javaFilename );

  }

  } catch( IOException ie ) {

  // 可能编译时出现IO错误。

  throw new ClassNotFoundException( ie.toString() );

  }

  }

  // 确保已经正确编译或者不需要编译,我们开始加载原始字节。

  try {

  // 读取字节。

  byte raw[] = getBytes( classFilename );

  // 转化为类对象

  clas = defineClass( name, raw, 0, raw.length );

  } catch( IOException ie ) {

  // 这里并不表示失败,可能我们处理的类在本地类库中,如java.lang.Object。

  }

  //System.out.println( "defineClass: "+clas );

  //可能在类库中,以默认的方式加载。

  if (clas==null) {

  clas = findSystemClass( name );

  }

  //System.out.println( "findSystemClass: "+clas );

  // 如果参数resolve为true,根据需要解释类。

  if (resolve && clas != null)

  resolveClass( clas );

  // 如果还没有获得类,说明出错了。

  if (clas == null)

  throw new ClassNotFoundException( name );

  // 否则,返回这个类对象。

  return clas;

  }

  }

  CCRun.java

  一下是CCRun.java文件

  import java.lang.reflect.*;

  /*

  CCLRun通过CompilingClassLoader加载类来运行程序。

  */

  public class CCLRun

  {

  static public 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 );



 
  • 上一个文章:

  • 下一个文章:
  • 网站版权与免责声明
    ①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
    ②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
    最新文章
    热门文章

    报名考试
    全国 | 黑龙江 | 吉林 | 辽宁 | 内蒙古
    青海 | 宁夏 | 甘肃 | 新疆 | 陕西
    西藏 | 北京 | 天津 | 河北 | 山东
    江苏 | 安徽 | 河南 | 上海 | 浙江
    福建 | 广东 | 山西 | 湖南 | 湖北
    江西 | 广西 | 海南 | 云南 | 贵州
    四川 | 重庆
    分省高校计算机考试
    黑龙江 | 吉林 | 辽宁 | 内蒙古 | 河北
    北京 | 天津 | 新疆 | 甘肃 | 宁夏
    青海 | 陕西 | 山西 | 河南 | 山东
    江苏 | 安徽 | 浙江 | 福建 | 广东
    海南 | 广西 | 江西 | 湖北 | 湖南
    四川 | 上海 | 重庆 | 贵州 | 云南
    西藏
    成绩查询
    报考指南
    试题答案
    模拟试题
    考试辅导
    计算机一级 | 计算机二级 | 计算机三级 | 计算机四级
    经验交流
    高校计算机