2006-10-26

运用加密技术保护Java源代码

来源: 天极 作者:佚名 评论 0 条
 
// 利用定制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() );
 }
}


  Listing 2显示了一个简单的loadClass实现。代码中的大部分对所有ClassLoader对象来说都一样,但有一小部分(已通过注释标记)是特有的。在处理过程中,ClassLoader对象要用到其他几个辅助方法:

  findLoadedClass:用来进行检查,以便确认被请求的类当前还不存在。loadClass方法应该首先调用它。

  defineClass:获得原始类文件字节码数据之后,调用defineClass把它转换成一个Class对象。任何loadClass实现都必须调用这个方法。

  findSystemClass:提供默认ClassLoader的支持。假如用来寻找类的定制方法不能找到指定的类(或者有意地不用定制方法),则可以调用该方法尝试默认的装入方式。这是很有用的,非凡是从普通的JAR文件装入标准Java类时。

  resolveClass:当JVM想要装入的不仅包括指定的类,而且还包括该类引用的所有其他类时,它会把loadClass的resolve参数设置成true。这时,我们必须在返回刚刚装入的Class对象给调用者之前调用resolveClass。
共3页: 上一页 [1] 2 [3] 下一页

(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:对C#委托及事件委托的理解  
下一篇:C#程序实现动态调用DLL的研究
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号