当前位置:编程学习 > JAVA >>

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) 
  --------------------编程问答-------------------- 能不能给详细点。。。。不懂。帮忙把代码写一下把。谢谢 --------------------编程问答--------------------
引用 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……

因为你有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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,