为什么我不能将Signature投射到我自己的班级?

时间:2015-02-24 16:07:25

标签: java casting

所以我实现了一个签名类,最终来自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()中提取代码并将其放在其他位置......我希望能够快速访问它。

1 个答案:

答案 0 :(得分:0)

getInstance方法不会直接返回您的签名类,它会返回一个代理对象,最终会将所有调用委托给您的实现:

  

返回实现指定签名算法的Signature对象。 [...]返回一个新的Signature对象,该对象封装来自第一个支持指定算法的Provider的SignatureSpi实现。