java加密解密。类加载出现错误
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());
}
}
在线等待高手回复 --------------------编程问答-------------------- Class objClass = (Class) loader.loadClass("Bhui", true).newInstance();
->
Class objClass = (Class) loader.loadClass("Bhui", true);
or
Class objClass = (Class) loader.findClass("Bhui");
--------------------编程问答-------------------- loader.loadClass("Bhui", true).newInstance();这是生成实例,这个实例是Bhui的实例,所以强行转换为Class对象失败
--------------------编程问答-------------------- loadClass和findClass方法都是返回Class类型的
调用class.newInstance()方法就是创建一个实例了
--------------------编程问答-------------------- Object obj = (Class) loader.loadClass("Bhui", true).newInstance(); --------------------编程问答-------------------- Object obj = loader.loadClass("Bhui", true).newInstance(); --------------------编程问答-------------------- 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)
求解 --------------------编程问答-------------------- F:\photomanage\hard\bin\zhenghe\Bhui.class这个路径貌似给的不合适,用
class.getResourceAsStream(String name)
--------------------编程问答-------------------- 能不能给详细点。。。。不懂。帮忙把代码写一下把。谢谢 --------------------编程问答--------------------
因为你有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();
--------------------编程问答-------------------- 编译时使用-d生成包路径,即
javac -d . FileClassLoader.java
其中 . 代表当前路径,具体路径可以自己根据需要修改
执行
java FileClassLoader
--------------------编程问答-------------------- Class objClass = loader.findClass("com.ClassSock.Bhui"); //javadoc里推荐使用findClass
Object obj = objClass.newInstance();
我在上面已经声明了路径了 public static final String drive = "F:\\photomanage\\hard\\bin\\zhenghe\\";
所以在加路径就出现错误了。
求解 --------------------编程问答-------------------- 你看下Bhui.java的package是zhenghe而不是F:\\photomanage\\hard\\bin\\zhenghe\\ --------------------编程问答-------------------- 你的类有包信息package com.ClassSock;
包相当于文件夹
所以你的路径不包括包路径是不对的
你要用 javac -d 的方式来编译,把包路径也生成
然后加载的时候把包路径的信息也带上 --------------------编程问答-------------------- 已解决。谢谢。思路错了
补充:Java , Java SE