A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 袁冬梅 于 2012-5-2 00:47 编辑

在做自定义类加载器实验的时候,我调用defineClass(byte[],int,int)方法就没有出错,调用defineClass(String,byte[],int,int)方法的时候,我把findClass参数里面的name也作为了defineclass的参数,结果出错了。
在重写findClass的时候需要调用defineClass(String name,byte[] b,int off,int len)这个函数,那么这里的String name ,应该传入哪个参数,看了好半天API,没看懂,看源代码更晕了。实验了很多最后也没得到正确的路径。
所以,想问问defineClass(byte[] b,int off,int len)这个类中,怎么获取String name这个值?这个name有什么意义?怎么来定义这个参数才不会出错?
  1. Class clazz= new MyClassLoaderTest("itcastLib").loadClass("ClassForClassLoader");//使用自定义类加载器加载类的实例对象
  2. Object obj = clazz.newInstance();
  3. System.out.println(obj);
复制代码
代码部分因为出现这个错误,后来已经被我修改到和张老师一模一样了,加密解密等等步骤都没有问题。我估计应该是我使用[url=file:///C:/Documents%20and%20Settings/Administrator/桌面/jdk1.6API中文版/java/lang/ClassLoader.html#defineClass(java.lang.String, byte[], int, int)]defineClass(String, byte[], int, int)[/url]方法的String参数错误的原因 。
我自己实验了两种参数:
一种是和findclass方法里面的name,只传入了类的名字。即 name=“
ClassForClassLoader";
错误:
Exception in thread "main" java.lang.NoClassDefFoundError: ClassForClassLoader (wrong name: cn/itcast/day2/ClassForClassLoader)

一种是findclass方法里面获取class的路径,即name = "classLib\\ClassForClassLoader.class";
错误:
Exception in thread "main" java.lang.NoClassDefFoundError: classLib\ClassForClassLoader/class (wrong name: cn/itcast/day2/ClassForClassLoader)

会的同学教一下我,可以的话,帮我分析一下这个错误的意思吧!谢谢。O(∩_∩)O~

评分

参与人数 1技术分 +2 收起 理由
岳民喜 + 2

查看全部评分

7 个回复

倒序浏览
defineClass(String name,byte[] b,int off,int len)函数,这里的String name ,应该传入类的完整路径名。张老师的视频里有这么句代码
String classFileName=classDir+File.separator+name.substring(name.lastIndexOf('.')+1)+".class";即name应该传classFileName而不是findClass方法传进来的name。
NoClassDefFoundError这个错误,一般原因是代码当中有package语句,但是在使用时却没有用完整类名,即包名.类名,如 cn.itcast.day2.ClassForClassLoader,所以虚拟机能够找到该文件,但是加载不了。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
应该是受包名的影响
---------------------------
protected  Class<?> findClass(String name)
          使用指定的二进制名称查找类。

二进制名称
按照《Java Language Specification》的定义,任何作为 String 类型参数传递给 ClassLoader 中方法的类名称都必须是一个二进制名称。
有效类名称的示例包括:
   "java.lang.String"
   "javax.swing.JSpinner$DefaultEditor"
   "java.security.KeyStore$Builder$FileBuilder$1"
   "java.net.URLClassLoader$3$1"

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
蒋亮 发表于 2012-5-1 12:19
defineClass(String name,byte[] b,int off,int len)函数,这里的String name ,应该传入类的完整路径名。 ...

张老师的这句话按照他给定的代码理解下来应该是:
name = "cn.itcast.day2.类名",然后,他的classDir是itcastLib
得出的结果应该是:classFileName = "itcastLib\\类名.class"

这个参数我也试验过了,我实验的第二个参数就是这个。也是错误的。
回复 使用道具 举报
刘基军 发表于 2012-5-1 12:40
应该是受包名的影响
---------------------------
protected  Class findClass(String name)

恩,你这样的我看过了,我也试验了,那么照这样的看来,我的classLib和src是在平级目录下,也就是说是在工程里面。那么我这个包要怎么来写呢?classLib.classForLoader吗?貌似这样的我也试验过了。好想也是错的,上面的第二种就是错的实验结果。

我现在已经越来越混乱了。
回复 使用道具 举报
袁冬梅 发表于 2012-5-1 17:55
恩,你这样的我看过了,我也试验了,那么照这样的看来,我的classLib和src是在平级目录下,也就是说是在 ...

上午搞得的时候,效果还挺好的,刚才又搞了一会,什么现象都有了,我也晕了...很郁闷
回复 使用道具 举报
刘基军 发表于 2012-5-1 19:37
上午搞得的时候,效果还挺好的,刚才又搞了一会,什么现象都有了,我也晕了...很郁闷 ...

﹁_﹁✿,悲剧
回复 使用道具 举报
楼主,我也遇到了这样的问题,能不能发我一个加密class文件的实例
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马