ClassLoader Test 博客分类: java语言相关 JavaIDEACC++C#
程序员文章站
2024-02-22 08:24:52
...
配合这篇文章看http://www.iteye.com/topic/753834
- 自定义的ClassLoader有自己的上下文,你可以指定从什么地方得到这个文件或者流,本例是C:/classes/
- 调用自定义的ClassLoader的loadClass方法能根据package+className得到这个Class对象
(怎么从流转化为Class这个不需要我们操心,直接调用父类ClassLoader的defineClass方法)
package depeng.classload; import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel; /** * Created by IntelliJ IDEA. * User: depeng * Date: 2010-9-3 * Time: 15:48:02 * To change this template use File | Settings | File Templates. */ public class MyClassLoader extends ClassLoader { private String fileName; public MyClassLoader(String fileName) { this.fileName = fileName; } protected Class findClass(String className) throws ClassNotFoundException { Class clazz = this.findLoadedClass(className); if (null == clazz) { try { String classFile = getClassFile(className); FileInputStream fis = null; try { fis = new FileInputStream(classFile); } catch (FileNotFoundException e) { System.out.println(e); e.printStackTrace(); } FileChannel fileC = fis.getChannel(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); WritableByteChannel outC = Channels.newChannel(baos); ByteBuffer buffer = ByteBuffer.allocateDirect(1024); while (true) { int i = fileC.read(buffer); if (i == 0 || i == -1) { break; } buffer.flip(); outC.write(buffer); buffer.clear(); } fis.close(); byte[] bytes = baos.toByteArray(); // Converts an array of bytes into an instance of class Class clazz = defineClass(className, bytes, 0, bytes.length); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return clazz; } private byte[] loadClassBytes(String className) throws ClassNotFoundException { try { String classFile = getClassFile(className); FileInputStream fis = new FileInputStream(classFile); FileChannel fileC = fis.getChannel(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); WritableByteChannel outC = Channels.newChannel(baos); ByteBuffer buffer = ByteBuffer.allocateDirect(1024); while (true) { int i = fileC.read(buffer); if (i == 0 || i == -1) { break; } buffer.flip(); outC.write(buffer); buffer.clear(); } fis.close(); return baos.toByteArray(); } catch (IOException fnfe) { throw new ClassNotFoundException(className); } } private String getClassFile(String name) { StringBuffer sb = new StringBuffer(fileName); name = name.replace('.', File.separatorChar) + ".class"; sb.append(File.separator + name); return sb.toString(); } }
package depeng.classload; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; /** * Created by IntelliJ IDEA. * User: depeng * Date: 2010-9-3 * Time: 13:56:40 * To change this template use File | Settings | File Templates. */ public class Worker { public static void testInFileSystem() throws Exception { // URL[] urls = new URL[]{new URL("file:/C:/java/")}; // URLClassLoader loader = new URLClassLoader(urls); // Class clas = loader.loadClass("depeng.classload.URLClassLoaderTest"); // Method m = clas.getMethods()[0]; // Object o = clas.newInstance(); // m.invoke(o,null); // // System.out.println(loader.getClass()); // System.out.println(loader.getParent().getClass()); // System.out.println(loader.getParent().getParent().getClass()); // System.out.println(loader.getParent().getParent().getParent()); // System.out.println("cccc " +Worker.class.getClassLoader().getClass()); MyClassLoader mc = new MyClassLoader("C:/classes/"); Class aClass = mc.loadClass("depeng.classload.URLClassLoaderTest"); Method ma = aClass.getMethods()[0]; Object oa = aClass.newInstance(); ma.invoke(oa, null); System.out.println(mc.getClass()); System.out.println(mc.getParent().getClass()); System.out.println(mc.getParent().getParent().getClass()); System.out.println(mc.getParent().getParent().getParent()); } public static void main(String[] args) throws Exception { testInFileSystem(); } }