java JVM-自定义类加载器从零到有
发布时间:2020-12-15 07:43:00 所属栏目:Java 来源:网络整理
导读:自定义文件系统类加载器 public class Loader extends ClassLoader{ private String dir; public Loader(String dir) { this.dir=dir; } @Override protected Class? findClass(String name)throws ClassNotFoundException { Class? c=findLoadedClass(name)
自定义文件系统类加载器
public class Loader extends ClassLoader{ private String dir; public Loader(String dir) { this.dir=dir; } @Override protected Class<?> findClass(String name)throws ClassNotFoundException { Class<?> c=findLoadedClass(name); if(null!=c) { return c; }else { ClassLoader parent=this.getParent(); try { c=parent.loadClass(name); }catch(Exception e) { //e.printStackTrace(); } if(c!=null) { return c; }else { byte[] data=getData(name); if(data==null) { throw new ClassNotFoundException(); }else { c=defineClass(name,data,data.length); System.out.println("yes"); } } } return c; } private byte[] getData(String classname) { String path=dir+"/"+classname.replace(‘.‘,‘/‘)+".class"; InputStream is=null; ByteArrayOutputStream bos=new ByteArrayOutputStream(); try { is=new FileInputStream(path); int len=-1; byte[] buffer=new byte[1024]; while((len=is.read(buffer))!=-1) { bos.write(buffer,len); } bos.flush(); return bos.toByteArray(); }catch(IOException e) { e.printStackTrace(); return null; }finally { try { if(null!=is) { is.close(); } }catch(IOException e) { e.printStackTrace(); } try { if(null!=bos) { bos.close(); } }catch(IOException e) { e.printStackTrace(); } } } } javassist 创建java文件,然后使用自定义类加载器加载 public class One { public static void main(String[] args) throws Exception { ClassPool pool=ClassPool.getDefault(); CtClass cc=pool.makeClass("com.sxt.in.HelloWorld"); CtMethod m=CtMethod.make("public static void main(String[] args){System.out.println("aa");}",cc); cc.addMethod(m); cc.writeFile("d:/myjava"); Loader loader =new Loader("d:/myjava"); Class<?> c=loader.loadClass("com.sxt.in.HelloWorld"); System.out.println(c.getClassLoader()); } } cmd编译创建的java文件: C:Users10853>d: D:&;cd myjava D:myjava>javac -d . HelloWorld.java D:myjava>java com.sxt.in.HelloWorld aa D:myjava> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |