package cn.edu.bnu.songjie.ch10.selfclassloader; import java.io.*; /** * 自定义的类加载器,只需要扩展ClassLoader,然后覆盖它的findClass(Sring name)方法即可, * 该方法根据参数指定的类名,返回对应的Class对象的引用。 * @author songjie * */ public class MyClassLoader extends ClassLoader{ private String name; private String path = "d:\\"; private final String fileType = ".class"; public MyClassLoader(String name){ 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){ byte[] data = loadClassData(name); return defineClass(name, data, 0, data.length);//此方法从ClassLoader继承而来 } /** * 把类的二级制数据读入到内存 * @param name * @return */ private byte[] loadClassData(String name){ FileInputStream fis = null; byte[] data = null; ByteArrayOutputStream baos = null; try{ 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(FileNotFoundException e1){ System.out.println("文件没找到"); }catch(IOException e2){ System.out.println("文件内容读取异常"); }finally{ try{ baos.close(); fis.close(); }catch(IOException e3){ e3.printStackTrace(); } } return data; } }
自定义类加载器-孙卫琴《Java面向对象编程》
最新推荐文章于 2024-09-20 15:32:13 发布