summaryrefslogtreecommitdiff
path: root/src/test/HotSwapCL.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/HotSwapCL.java')
-rw-r--r--src/test/HotSwapCL.java73
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;
+ }
+}