MD5 消息摘要在系统类装入器中不可用



我有一个自定义类加载器,在它的构造函数中我有以下行。

MessageDigest.getInstance("MD5")

当我使用自定义类装入器作为系统类装入器运行示例主应用程序时,出现以下错误。

Error occurred during initialization of VM
java.lang.Error: java.security.NoSuchAlgorithmException: MD5 MessageDigest not available
at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1504)
at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1468)

由于安全提供程序来自 rt.jar,我认为这些类必须由引导类加载器加载,因此我应该能够在我的类加载器中使用它们。毕竟,我可以访问 MessageDigest 类。为什么提供程序类不可用?

编辑:

我注意到的一件奇怪的事情是,虽然以下内容失败了,

getInstance("MD5")
getInstance("MD5", "SUN")

这个有效!

getInstance("MD5", new sun.security.provider.Sun())

因此,提供程序类毕竟是由引导加载程序加载的,但由于某种原因查找失败。我想知道为什么?

我刚刚尝试将 MD5 作为自定义类加载器中构造函数的一部分加载,似乎加载正常。

MD5 是以下方面的一部分:import java.security.MessageDigest;

我也尝试了 SHA - 这对我来说也很好。可能你可以重新检查java版本 - 因为旧版本不包括在内,或者你可以通过加载其他算法来检查。喜欢SHA什么的?

我的代码片段 public MD5Test(){ super(MD5Test.class.getClassLoader()); 尝试 { MessageDigest md = MessageDigest.getInstance("MD5"); System.out.println("Here I am.."); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }

您的自定义类加载器可能做了错误的事情 - 例如,不从extdirs路径加载,或者没有将类加载请求传递给父级,以便它可以做同样的事情。

如果您只处理应用程序类路径,而不是 ext 类路径,这正是将要发生的事情(我知道,因为我在编写自定义类加载器时遇到了同样的问题)。

首先要检查的是类装入请求是否如您所料地进入您的类装入器。是吗?

最新更新