用户名: 密码: 免费注册 忘记密码? 网站地图 | 加入收藏 | 设为首页
首页 | 新闻 | 工具 | 系统 | 办公 | 聊天 | 多媒体 | 网页 | 运营 | 平面 | 欣赏 | 数据库 | 程序 | 服务器 | 组网
网页 | 3dmax | Ghost | Windows Xp| Dreamweaver | photoshop | Flash | office | Alexa | Css | QQ | Asp | PHP | Jsp | Access
Flash MX 2004入门 | 网站推广策略 | CorelDRAW入门 | ASP学习 | 网站建设大师功 | Word入门
  iTbulo.com > 学院 > 程序开发教程 > JSP教程 > Jsp基础教程 > 正文
有效防止Java程序源码被人偷窥?
iTbulo.COM 2007-7-24 佚名()

 

二、定制类装入器

  每一个运行着的JVM已经拥有一个ClassLoader。这个默认的ClassLoader根据CLASSPATH环境变量的值,在本地文件系统中寻找合适的字节码文件。

  应用定制ClassLoader要求对这个过程有较为深入的认识。我们首先必须创建一个定制ClassLoader类的实例,然后显式地要求它装入另外一个类。这就强制JVM把该类以及所有它所需要的类关联到定制的ClassLoader。Listing 1显示了如何用定制ClassLoader装入类文件。

  【Listing 1:利用定制的ClassLoader装入类文件】

以下是引用片段:

  // 首先创建一个ClassLoader对象
  ClassLoader myClassLoader = new myClassLoader();
  // 利用定制ClassLoader对象装入类文件
  // 并把它转换成Class对象
  Class myClass = myClassLoader.loadClass( "mypackage.MyClass" );
  // 最后,创建该类的一个实例
  Object newInstance = myClass.newInstance();
  // 注意,MyClass所需要的所有其他类,都将通过
  // 定制的ClassLoader自动装入

  如前所述,定制ClassLoader只需先获取类文件的数据,然后把字节码传递给运行时系统,由后者完成余下的任务。

  ClassLoader有几个重要的方法。创建定制的ClassLoader时,我们只需覆盖其中的一个,即loadClass,提供获取原始类文件数据的代码。这个方法有两个参数:类的名字,以及一个表示JVM是否要求解析类名字的标记(即是否同时装入有依赖关系的类)。如果这个标记是true,我们只需在返回JVM之前调用resolveClass。

  【Listing 2:ClassLoader.loadClass()的一个简单实现】

以下是引用片段:
public Class loadClass( String name, boolean resolve )
  throws ClassNotFoundException {
  try {
  // 我们要创建的Class对象
  Class clasz = null;
  // 必需的步骤1:如果类已经在系统缓冲之中,
  // 我们不必再次装入它
  clasz = findLoadedClass( name );
  if (clasz != null)
  return clasz;
  // 下面是定制部分
  byte classData[] = /* 通过某种方法获取字节码数据 */;
  if (classData != null) {
  // 成功读取字节码数据,现在把它转换成一个Class对象
  clasz = defineClass( name, classData, 0, classData.length );
  }
  // 必需的步骤2:如果上面没有成功,
  // 我们尝试用默认的ClassLoader装入它
  if (clasz == null)
  clasz = findSystemClass( name );
  // 必需的步骤3:如有必要,则装入相关的类
  if (resolve && clasz != null)
  resolveClass( clasz );
  // 把类返回给调用者
  return clasz;
  } catch( IOException ie ) {
  throw new ClassNotFoundException( ie.toString() );
  } catch( GeneralSecurityException gse ) {
  throw new ClassNotFoundException( gse.toString() );
  }
  }

 

上一页  [1] [2] [3] [4] [5] [6] [7] 下一页

文章搜索
相关资讯
相关文章 相关下载
没有相关文章
焦点信息