⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myclassloader.java

📁 这是孙卫琴在"Java与面向对象编程"一书的源代码。
💻 JAVA
字号:
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class MyClassLoader extends ClassLoader{
    //给类加载器指定一个名字,在本例中是为了便于区分不同的加载器对象
    private String name;  
    private String path = "d:\\";
    private final String fileType = ".class";

    public MyClassLoader(String name){
        super();
        this.name=name;
    }

    public MyClassLoader(ClassLoader parent,String name){
        super(parent);
        this.name=name;
    }
   
    public String toString(){return name;}

    public void setPath(String path){this.path=path;}
    public String getPath(){return path;}

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

        /** 把类的二进制数据读入到内存中 */
    private byte[] loadClassData(String name)throws ClassNotFoundException{
        FileInputStream fis = null;
        byte[] data = null;
        ByteArrayOutputStream baos=null;
        try{
            //把name字符串中的“.”替换为“\”,从而把类中的包名转变为路径名
            //例如,如果name原来为“com.abc.Sample”,那么将被转变为“com\abc\Sample”
            name=name.replaceAll("\\.","\\\\");
            fis = new FileInputStream(new File(path + name + fileType));
            baos = new ByteArrayOutputStream();
            int ch = 0;
            while ((ch = fis.read()) != -1){
                baos.write(ch);
            }
            data = baos.toByteArray();
        } catch (IOException e){
            //异常转译
            throw new ClassNotFoundException("Class is not found:"+name,e);
        }finally{
          try{
            fis.close();
            baos.close();
          }catch(IOException e){ e.printStackTrace();}
        }
        return data;
    }

    public static void main(String[] args) throws Exception{
        MyClassLoader loader1 = new MyClassLoader("loader1");
        loader1.setPath("D:\\myapp\\serverlib\\");
        MyClassLoader loader2 = new MyClassLoader(loader1, "loader2");
        loader2.setPath("D:\\myapp\\clientlib\\");
        MyClassLoader loader3 = new MyClassLoader(null, "loader3");
        loader3.setPath("D:\\myapp\\otherlib\\");

        test(loader2);
        test(loader3);
     }

     public static void test(ClassLoader loader)throws Exception{
        Class objClass = loader.loadClass("Sample");
        Object obj=objClass.newInstance(); //创建一个Sample类的实例
   }

}


/****************************************************
 * 作者:孙卫琴                                     *
 * 来源:<<Java面向对象编程>>                       *
 * 技术支持网址:www.javathinker.org                *
 ***************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -