Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MD5 MessageDigest在系统类加载器中不可用_Java_Classloader - Fatal编程技术网

Java MD5 MessageDigest在系统类加载器中不可用

Java MD5 MessageDigest在系统类加载器中不可用,java,classloader,Java,Classloader,我有一个自定义类加载器,在它的构造函数中,我有以下行 MessageDigest.getInstance("MD5") 当我使用自定义类加载器作为系统类加载器运行示例主应用程序时,出现以下错误 Error occurred during initialization of VM java.lang.Error: java.security.NoSuchAlgorithmException: MD5 MessageDigest not available at java.lang.ClassLo

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

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是以下内容的一部分: 导入java.security.MessageDigest

我也试过SHA,这对我来说也很好。 可能您可以重新检查java版本-因为旧版本没有包含它,或者您可以通过加载其他algo来检查。像沙什么的

我的代码片段 公共MD5Test(){ super(MD5Test.class.getClassLoader()); 试一试{ MessageDigest md=MessageDigest.getInstance(“MD5”); System.out.println(“我在这里…”); }捕获(无算法异常){ e、 printStackTrace();
}

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

如果您只处理app类路径,而不是ext类路径,那么这就是将要发生的事情(我知道,因为我在编写自定义类加载器时遇到了相同的问题)


首先要检查的是类加载请求是否如您所期望的那样进入到您的类加载器中。是吗?

您是否使用自定义类加载器作为系统类加载器(java.system.class.loader)?我注意到的另一件奇怪的事情是,当getInstance(“MD5”)和getInstance(“MD5”,“SUN”)失败时,getInstance(“MD5”,new SUN())工作!请求在我的类加载器的构造函数中,所以它还没有被构造。在我看来,请求应该转到我的类加载器的类加载器,该类加载器应该委托给引导加载器。