配合这篇文章看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();
}
}