使用Java 8 update101时,HashMap.entries无法强制转换为Collection

tar*_*unk 3 java java-8

更新到Java 8更新101后,我在以下代码中遇到异常.它与Java 8更新91一起工作正常.

访问密钥库:

        KeyStore ks = KeyStore.getInstance("WINDOWS-MY");
        ks.load(null, null);

        Field field =  ks.getClass().getDeclaredField("keyStoreSpi");
        field.setAccessible(true);

        KeyStoreSpi kss = (KeyStoreSpi) field.get(ks);

        Collection entries;

        field = kss.getClass().getEnclosingClass().getDeclaredField("entries");
        field.setAccessible(true);

        // This is where the exception happens
        entries = (Collection) field.get(kss);

        // I then have to loop on these entries, something like this:

        for (Object entry : entries) { //code }
Run Code Online (Sandbox Code Playgroud)

类型转换,抛出异常:

java.util.HashMap cannot be cast to java.util.Collection
Run Code Online (Sandbox Code Playgroud)

Java 8更新101中最近的任何更改?怎么解决?

Ste*_*n C 7

怎么解决?

正如评论中所指出的,你所做的是令人讨厌的.您不应该搞乱库类的内部实现细节.它们可能会发生变化,然后您的代码就会破坏......就像它在这里所做的那样.

最好的解决方案是限制自己使用公共API方法KeyStore; 例如,调用aliases()然后迭代生成的Enumeration<String>查找每个别名的条目.

如果您不能这样做,那么您将需要修改代码以使用KeyStore您和代码的其他用户可能遇到的所有不同实现.