在给出示例代码前,有两点内容需要说明一下:1、要想实现同一个类的不同版本的共存,那么这些不同版本必须由不同的类加载器进行加载,因此就不能把这些类的加载工作委托给系统加载器来完成,因为它们只有一份。2、为了做到这一点,就不能采用系统默认的类加载器委托规则,也就是说我们定制的类加载器的父加载器必须设置为null。
该定制的类加载器的实现代码如下:
1.class CustomCL extends ClassLoader {
2.
3. private String basedir; // 需要该类加载器直接加载的类文件的基目录
4. private HashSet dynaclazns; // 需要由该类加载器直接加载的类名
5.
6. public CustomCL(String basedir, String[] clazns) {
7. super(null); // 指定父类加载器为 null
8. this.basedir = basedir;
9. dynaclazns = new HashSet();
10. loadClassByMe(clazns);
11. }
12.
13. private void loadClassByMe(String[] clazns) {
14. for (int i = 0; i < clazns.length; i++) {
15. loadDirectly(clazns[i]);
16. dynaclazns.add(clazns[i]);
17. }
18. }
19.
20. private Class loadDirectly(String name) {
21. Class cls = null;
22. StringBuffer sb = new StringBuffer(basedir);
23. String classname = name.replace('.', File.separatorChar) + ".class";
24. sb.append(File.separator + classname);
25. File classF = new File(sb.toString());
26. cls = instantiateClass(name,new FileInputStream(classF),
27. classF.length());
28. return cls;
29. }
30.
31. private Class instantiateClass(String name,InputStream fin,long len){
32. byte[] raw = new byte[(int) len];
33. fin.read(raw);
34. fin.close();
35. return defineClass(name,raw,0,raw.length);
36. }
37.
38. protected Class loadClass(String name, boolean resolve)
39. throws ClassNotFoundException {
40. Class cls = null;
41. cls = findLoadedClass(name);
42. if(!this.dynaclazns.contains(name) && cls == null)
43. cls = getSystemClassLoader().loadClass(name);
44. if (cls == null)
45. throw new ClassNotFoundException(name);
46. if (resolve)
47. resolveClass(cls);
48. return cls;
49. }
50.
51.}