反射によって記載されたdllの名前を取得し、反射によってロードされたdllファイルを解放する

1556 ワード

ロードしたdllファイルの名前を取得
    try{
        ClassLoader classLoader = this.getClass().getClassLoader();
        Field field = ClassLoader.class.getDeclaredField("nativeLibraries");
        field.setAccessible(true);
        Vector libs = (Vector) field.get(classLoader);
        logger.info("nativeLibraries size = " + libs.size());
        Iterator it = libs.iterator();
        Object o;
        while (it.hasNext()) {
            o = it.next();
            Field fieldName = o.getClass().getDeclaredField("name");
            fieldName.setAccessible(true);
            // o 
            logger.info("nativeLibraries name = " + fieldName.get(o));
        }
    }catch (Exception e){
        logger.info("nativeLibraries = " + e.toString());
    }

dllファイルを解放し、名前に基づいて特定のdllファイルを解放できます.
    try {
        ClassLoader classLoader = this.getClass().getClassLoader();
        Field field = ClassLoader.class.getDeclaredField("nativeLibraries");
        field.setAccessible(true);
        Vector libs = (Vector) field.get(classLoader);
        Iterator it = libs.iterator();
        Object o;
        while (it.hasNext()) {
            o = it.next();
            Method finalize = o.getClass().getDeclaredMethod("finalize", new Class[0]);
            finalize.setAccessible(true);
            finalize.invoke(o, new Object[0]);
        }
    } catch (Exception ex) {
        System.out.println(" dll , !");
        throw new RuntimeException(ex);
    }