所以我实现了一个签名类,最终来自SignatureSpi。在我的课堂上,我添加了一个公共方法来利用在类层次结构中写得更高的逻辑。有几个抽象层次;这并不重要,重要的是,其中一个更深层次的类提供了我想从我的班级调用的方法A()。
所以,我有:
Signature sig = Signature.getInstance(sigAlg, "provider");
sig.initSign(privKey);
sig.update(data);
byte[] signature = sig.sign();
byte[] plainSig = ((MySigProviderClass)(SignatureSpi)sig).ExtDecodeSignature(signature);
在IDE(intellij)中看起来都很好。
但是,当我尝试运行它时,我得到java.lang.ClassCastException: java.security.Signature$Delegate cannot be cast to com.company.my.provider.signature.MySigProviderClass
。为什么呢?
我知道我可以从A()中提取代码并将其放在其他位置......我希望能够快速访问它。
答案 0 :(得分:0)
getInstance方法不会直接返回您的签名类,它会返回一个代理对象,最终会将所有调用委托给您的实现:
返回实现指定签名算法的Signature对象。 [...]返回一个新的Signature对象,该对象封装来自第一个支持指定算法的Provider的SignatureSpi实现。