Java 如何清除 kidCache?

Java How do you clear kidCache?

Java classPreferences 有一个名为 kidCache 的 HashMap 属性。当执行 Preferences 方法 remove(String node) 节点有效地从用户的首选项文件中删除,但不是从 kidCache 属性.
因此,当我打印到控制台 prefs.nodeExists("account-1")Arrays.toString(prefs.childrenNames()) 时,它仍然显示为可用。直到当前程序执行完毕才最终清零。

public class ClassA {
    private Preferences prefs = Preferences.userRoot().node("TestNode");

    public static void main(String[] args) {
        new ClassA();
    }

    public ClassA() {
        prefs = Preferences.userRoot().node("TestNode/account-1");
        prefs.put("username", "testUser1");
        prefs = Preferences.userRoot().node("TestNode");
        prefs.remove("account-1/"); // node removed here
        try {
            System.out.println(prefs.nodeExists("account-1")); // a test for its existance still outputs 'true'
            System.out.println(Arrays.toString(prefs.childrenNames())); // kidCache can be retrieved with this method
        } catch (BackingStoreException e) {
            e.printStackTrace();
        }

    }
}

输出:

Connected to the target VM, address: '127.0.0.1:58572', transport: 'socket'
true
[account-1]

我尝试使用 prefs.flush(),但没有用。如何在程序执行完之前彻底清除子节点?

我找到了解决问题的方法。虽然我还没有弄清楚如何手动清除 kidCache,但删除节点的正确方法是设置节点的路径,然后使用 removeNode() 方法而不是 remove(String node) 方法一级向上。

public class ClassA {
    private Preferences prefs = Preferences.userRoot().node("TestNode");

    public static void main(String[] args) {
        new ClassA();
    }

    public ClassA() {
        prefs = Preferences.userRoot().node("TestNode/account-1");
        prefs.put("username", "testUser1");
        prefs.removeNode();
        prefs = Preferences.userRoot().node("TestNode");
        try {
            System.out.println(prefs.nodeExists("account-1")); // a test for its existence now outputs 'false'
        } catch (BackingStoreException e) {
            e.printStackTrace();
        }

    }
}

输出

Connected to the target VM, address: '127.0.0.1:58572', transport: 'socket'
false