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());
      
             
     }
}在线等待高手回复

解决方案 »

  1.   

    Class objClass = (Class) loader.loadClass("Bhui", true).newInstance();
    ->
    Class objClass = (Class) loader.loadClass("Bhui", true);
    or
    Class objClass = (Class) loader.findClass("Bhui");
      

  2.   

    loader.loadClass("Bhui", true).newInstance();这是生成实例,这个实例是Bhui的实例,所以强行转换为Class对象失败
      

  3.   

    loadClass和findClass方法都是返回Class类型的
    调用class.newInstance()方法就是创建一个实例了
      

  4.   

    Object obj = (Class) loader.loadClass("Bhui", true).newInstance();
      

  5.   

    Object obj = loader.loadClass("Bhui", true).newInstance();
      

  6.   

    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)
    求解
      

  7.   

    F:\photomanage\hard\bin\zhenghe\Bhui.class这个路径貌似给的不合适,用class.getResourceAsStream(String name) 
     
      

  8.   

    因为你有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();
      

  9.   

    编译时使用-d生成包路径,即
    javac -d . FileClassLoader.java
    其中 . 代表当前路径,具体路径可以自己根据需要修改
    执行
    java FileClassLoader
      

  10.   

    Class objClass = loader.findClass("com.ClassSock.Bhui"); //javadoc里推荐使用findClass
    Object obj = objClass.newInstance();
    我在上面已经声明了路径了 public static final String drive = "F:\\photomanage\\hard\\bin\\zhenghe\\";
    所以在加路径就出现错误了。
    求解
      

  11.   

    你看下Bhui.java的package是zhenghe而不是F:\\photomanage\\hard\\bin\\zhenghe\\
      

  12.   

    你的类有包信息package com.ClassSock;
    包相当于文件夹
    所以你的路径不包括包路径是不对的
    你要用 javac -d 的方式来编译,把包路径也生成
    然后加载的时候把包路径的信息也带上