diff options
Diffstat (limited to 'src/test/HotSwapCL.java')
| -rw-r--r-- | src/test/HotSwapCL.java | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/test/HotSwapCL.java b/src/test/HotSwapCL.java new file mode 100644 index 0000000..488e27a --- /dev/null +++ b/src/test/HotSwapCL.java @@ -0,0 +1,73 @@ +package test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashSet; +import org.apache.log4j.Logger; + +import com.nis.nmsclient.util.Utils; + +class HotSwapCL extends ClassLoader { + private Logger logger = Logger.getLogger(ClassLoader.class); + private String basedir; // 需要该类加载器直接加载的类文件的基目录 + private HashSet dynaclazns; // 需要由该类加载器直接加载的类名 + + public HotSwapCL(String basedir, String[] clazns) { + super(null); // 指定父类加载器为 null + this.basedir = basedir; + dynaclazns = new HashSet(); + loadClassByMe(clazns); + } + + private void loadClassByMe(String[] clazns) { + for (int i = 0; i < clazns.length; i++) { + try { + loadDirectly(clazns[i]); + } catch (Exception e) { + logger.error(Utils.printExceptionStack(e)); + } + dynaclazns.add(clazns[i]); + } + } + + private Class loadDirectly(String name) throws Exception{ + Class cls = null; + StringBuffer sb = new StringBuffer(basedir); + String classname = name.replace('.', File.separatorChar) + ".class"; + sb.append(File.separator + classname); + + File classF = new File(sb.toString()); + cls = instantiateClass(name, new FileInputStream(classF), classF + .length()); + return cls; + } + + private Class instantiateClass(String name, InputStream fin, long len) throws Exception{ + byte[] raw = new byte[(int) len]; + try { + fin.read(raw); + } catch (IOException e) { + throw e; + }finally{ + if(fin!=null){ + fin.close(); + } + } + return defineClass(name, raw, 0, raw.length); + } + + protected Class loadClass(String name, boolean resolve) + throws ClassNotFoundException { + Class cls = null; + cls = findLoadedClass(name); + if (!this.dynaclazns.contains(name) && cls == null) + cls = getSystemClassLoader().loadClass(name); + if (cls == null) + throw new ClassNotFoundException(name); + if (resolve) + resolveClass(cls); + return cls; + } +} |
