标签:java虚拟机 get 详解 end hello register 源码 虚拟 row
今后一段时间会全面读一下《深入理解Java虚拟机》
在这里先记一下在网上看到的几篇介绍 类加载器 的文章,等读到虚拟机类加载机制再详细介绍。
贴一个自己写的类加载器。
Hello类。 把编译后的class文件放到别的路径下。
package ww; public class Hello { public void say() { System.out.println("hello world"); } }
WwClassLoader类。 继承ClassLoader类 重写 findClass()方法
package ww; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class WwClassLoader extends ClassLoader { private String path; //路径 public WwClassLoader(String path) { this.path = path; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { String fileName = parseFileName(name); File file = new File(path,fileName); try { //读取class文件 FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int lenth = 0; while((lenth = fis.read()) != -1) { baos.write(lenth); } byte[] buffer = baos.toByteArray(); baos.close(); fis.close(); //实例化class对象 return defineClass(name,buffer,0,buffer.length); } catch (Exception e) { e.printStackTrace(); } return super.findClass(name); } //解析文件路径 private String parseFileName(String name) { int index = name.lastIndexOf(‘.‘); if(index == -1) { return name+".class"; } else { return name.substring(index+1)+".class"; } } }
WwTest类。 调用测试
package ww; import java.lang.reflect.Method; public class WwTest { public static void main(String[] args) { //我一直在找为什么自己定义的类的parent节点一定是AppClassLoader类的源码。要是知道的大佬可以告诉我一声 /*private static native void registerNatives(); static { registerNatives(); }*/ WwClassLoader ww = new WwClassLoader("E://lib"); try { Class hel = ww.findClass("ww.Hello"); //反射执行方法 if (hel != null) { Object obj = hel.newInstance(); Method method = hel.getDeclaredMethod("say", null); method.invoke(obj, null); } } catch (Exception e) { e.printStackTrace(); } } }
标签:java虚拟机 get 详解 end hello register 源码 虚拟 row
原文地址:https://www.cnblogs.com/zhaww/p/8867065.html