1

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

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())

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

4

2 回答 2

1

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

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

首先要检查的是类加载请求是否按照您的预期进入您的类加载器。是吗?

于 2013-01-28T19:25:43.210 回答
1

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

MD5 的一部分是:import java.security.MessageDigest;

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

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

于 2013-01-28T18:22:08.803 回答