java加密解密。类加载出现错误

nbxiaozhe369 2011-09-22 03:11:06
package com.ClassSock;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileClassLoader extends ClassLoader
{
public static final String drive = "F:\\photomanage\\hard\\bin\\zhenghe\\";
public static final String fileType = ".class";

public FileClassLoader() {
super();

}

public FileClassLoader(ClassLoader arg0) {
super(arg0);
}

public Class findClass(String name)
{
byte[] data = loadClassData(name);
return defineClass(name, data, 0, data.length);
}

public byte[] loadClassData(String name)
{
FileInputStream fis = null;
byte[] data = null;
try
{
fis = new FileInputStream(new File(drive + name + fileType));
System.out.println(drive + name + fileType);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int ch = 0;
while ((ch = fis.read()) != -1)
{
baos.write(ch);

}
data = baos.toByteArray();
} catch (IOException e)
{
e.printStackTrace();
}

return data;
}


public static void main(String[] args) throws Exception
{
FileClassLoader loader = new FileClassLoader();
Class objClass = (Class) loader.loadClass("Bhui", true).newInstance();

Object obj = objClass.newInstance();
// System.out.println(objClass.getName());
// System.out.println(objClass.getClassLoader());


}
}



在线等待高手回复
...全文
136 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nbxiaozhe369 2011-09-22
  • 打赏
  • 举报
回复
已解决。谢谢。思路错了
qybao 2011-09-22
  • 打赏
  • 举报
回复
你的类有包信息package com.ClassSock;
包相当于文件夹
所以你的路径不包括包路径是不对的
你要用 javac -d 的方式来编译,把包路径也生成
然后加载的时候把包路径的信息也带上
softroad 2011-09-22
  • 打赏
  • 举报
回复
你看下Bhui.java的package是zhenghe而不是F:\\photomanage\\hard\\bin\\zhenghe\\
nbxiaozhe369 2011-09-22
  • 打赏
  • 举报
回复
Class objClass = loader.findClass("com.ClassSock.Bhui"); //javadoc里推荐使用findClass
Object obj = objClass.newInstance();
我在上面已经声明了路径了 public static final String drive = "F:\\photomanage\\hard\\bin\\zhenghe\\";
所以在加路径就出现错误了。
求解
qybao 2011-09-22
  • 打赏
  • 举报
回复
编译时使用-d生成包路径,即
javac -d . FileClassLoader.java
其中 . 代表当前路径,具体路径可以自己根据需要修改
执行
java FileClassLoader
qybao 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nbxiaozhe369 的回复:]
Class objClass = loader.loadClass("Bhui", true);

Object obj = objClass.newInstance();

我这样改了以后出现

F:\photomanage\hard\bin\zhenghe\Bhui.class
ssssssssssssss
Exception in thread "main" java.l……
[/Quote]
因为你有package,所以需要把package的信息带上,否则无法正确找到类

  public byte[] loadClassData(String name)
{
FileInputStream fis = null;
byte[] data = null;
try
{
if (name.indexOf(".") > 0) { //把包信息也解析
name = name.relaceAll("\\.", "\\\\");
}
fis = new FileInputStream(new File(drive + name + fileType));
System.out.println(drive + name + fileType);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int ch = 0;
while ((ch = fis.read()) != -1)
{
baos.write(ch);

}
data = baos.toByteArray();
} catch (IOException e)
{
e.printStackTrace();
}

return data;
}

调用
Class objClass = loader.findClass("com.ClassSock.Bhui"); //javadoc里推荐使用findClass
Object obj = objClass.newInstance();

nbxiaozhe369 2011-09-22
  • 打赏
  • 举报
回复
能不能给详细点。。。。不懂。帮忙把代码写一下把。谢谢
softroad 2011-09-22
  • 打赏
  • 举报
回复
F:\photomanage\hard\bin\zhenghe\Bhui.class这个路径貌似给的不合适,用

class.getResourceAsStream(String name)
nbxiaozhe369 2011-09-22
  • 打赏
  • 举报
回复
Class objClass = loader.loadClass("Bhui", true);

Object obj = objClass.newInstance();

我这样改了以后出现

F:\photomanage\hard\bin\zhenghe\Bhui.class
ssssssssssssss
Exception in thread "main" java.lang.NoClassDefFoundError: Bhui (wrong name: zhenghe/Bhui)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at com.ClassSock.FileClassLoader.findClass(FileClassLoader.java:25)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.ClassSock.FileClassLoader.main(FileClassLoader.java:57)


求解
softroad 2011-09-22
  • 打赏
  • 举报
回复
Object obj = loader.loadClass("Bhui", true).newInstance();
softroad 2011-09-22
  • 打赏
  • 举报
回复
Object obj = (Class) loader.loadClass("Bhui", true).newInstance();
淡定的峰哥 2011-09-22
  • 打赏
  • 举报
回复
loadClass和findClass方法都是返回Class类型的
调用class.newInstance()方法就是创建一个实例了
qybao 2011-09-22
  • 打赏
  • 举报
回复
loader.loadClass("Bhui", true).newInstance();这是生成实例,这个实例是Bhui的实例,所以强行转换为Class对象失败

qybao 2011-09-22
  • 打赏
  • 举报
回复
Class objClass = (Class) loader.loadClass("Bhui", true).newInstance();
->
Class objClass = (Class) loader.loadClass("Bhui", true);
or
Class objClass = (Class) loader.findClass("Bhui");

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧