HelloWorld 善战者,求之于势,不责于人;故能择人而任势。

知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。物有本末,事有终始。知所先后,则近道矣。

  BlogJava :: 首页 ::  :: 联系 ::  :: 管理 ::
  167 随笔 :: 1 文章 :: 40 评论 :: 0 Trackbacks

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Vector;

public class FreeDynamicDll {
 static {
  // 首先确保这些dll文件存在
  System.load("c:/test/Decode.dll");
 }

 /**
  * 卸载已经装载的dll
  *
  * @param dllName
  *            库名,如Decode.dll
  */
 

 private synchronized void freeDll(String dllName) {
  try {
   ClassLoader classLoader = this.getClass().getClassLoader();
   Field field = ClassLoader.class.getDeclaredField("nativeLibraries");
   field.setAccessible(true);
   Vector<Object> libs = (Vector<Object>) field.get(classLoader);
   Iterator<Object> it = libs.iterator();
   Object o;
   while (it.hasNext()) {
    o = it.next();
    Field[] fs = o.getClass().getDeclaredFields();
    boolean hasInit = false;
    for (int k = 0; k < fs.length; k++) {
     if (fs[k].getName().equals("name")) {
      fs[k].setAccessible(true);
      String dllPath = fs[k].get(o).toString();
      if (dllPath.endsWith(dllName)) {
       hasInit = true;
      }
     }
    }
    if (hasInit) {
     Method finalize = o.getClass().getDeclaredMethod(
       "finalize", new Class[0]);
     finalize.setAccessible(true);
     finalize.invoke(o, new Object[0]);
     it.remove();       
     libs.remove(o);
    }
   }

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 
 public static void main(String args[]) {
  FreeDynamicDll t = new FreeDynamicDll();
  t.freeDll("Decode.dll");
 }
}



</script>

posted on 2007-11-26 14:31 helloworld2008 阅读(1305) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: