このコードの実行中に例外が発生しました。
p7 = new PKCS7(p7byte);
...
SignerInfo si = p7.getSignerInfos()[0];
String name = si.getDigestAlgorithmId().getName();
例外は次のとおりです。
Exception in thread "main" java.lang.NoSuchMethodError: sun/security/pkcs/SignerInfo.getDigestAlgorithmId()Lsun/security/x509/AlgorithmId;
at reflex.Reflex.testPKCS7(Reflex.java:151)
at reflex.Reflex.main(Reflex.java:43)
この例外は、コードが IBM マシンで実行されるとスローされ、Windows マシンで実行されると正常に動作します。
si.getDigestAlgoritmId()
これを調べたところ、 IBM マシンの戻りクラスが異なることがわかりました。IBM の Java の場合はcom.ibm.security.x509.AlgorithmId
であり、java6 の場合はsun.security.x509.AlgorithmId
です。そして、両方のクラスにgetName()
メソッドがあります。
しかし、最も奇妙なことは、リフレクションによってメソッドを呼び出すと、例外が表示されず、両方の環境で正しく動作することです。なぜこのように機能するのか、誰かが答えることができますか?
解決策はリフレクションで行うことだと思いますが、リフレクションで機能する理由と、通常は機能しない理由を知りたいです。主に、将来同様の間違いを避けるためです。
事前に感謝し、私の下手な英語で申し訳ありません.
編集:リフレクションコール:
try{
Class clase = si.getClass();
Method metodo = clase.getMethod("getDigestAlgorithmId");
Object result = metodo.invoke(si,null);
System.out.println("Result.class=" + result.getClass().getName());
System.out.println("Result=" + result);
}catch(Exception e){...}