首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法可以在反射中工作,但在Java中不能以“正常方式”工作

方法可以在反射中工作,但在Java中不能以“正常方式”工作
EN

Stack Overflow用户
提问于 2012-06-28 22:50:19
回答 1查看 407关注 0票数 6

当我执行这段代码时,我得到了一个异常:

代码语言:javascript
复制
p7 = new PKCS7(p7byte);
...
SignerInfo si = p7.getSignerInfos()[0];
String name = si.getDigestAlgorithmId().getName();

例外情况是:

代码语言:javascript
复制
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()方法。

但最奇怪的是,如果我通过反射调用该方法,则不会出现异常,并且它在两种环境中都能正常工作。有人能回答为什么它是这样工作的吗?

我认为解决方案是使用反射,但我想知道为什么使用反射工作,以及正常的方式不工作。主要是为了避免将来出现类似的错误。

提前感谢并为我糟糕的英语表达歉意。

编辑:反射调用:

代码语言:javascript
复制
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){...}
EN

回答 1

Stack Overflow用户

发布于 2012-06-28 23:29:06

SignerInfo.getDigestAlgoritmId()在这两个版本中有不同的声明。如果你用一个声明编译你的类,它不能和另一个一起工作。类型存储在.class文件中,并且必须在运行时匹配。

如果使用反射,则不需要在编译时声明getDigestAlgoritmId。只要与您指定的名称和参数匹配,它就可以与任何声明一起工作。

对反射要小心。sun.security.x509.AlgorithmId似乎不是公共java API的一部分。不同的版本和供应商可能会有所不同。这两个只在返回类型上有所不同。谁知道其他Java实现有什么不同。如果可能,请坚持使用官方Java API。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11247268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档