动态地将Object实例转换为真实的子类实例

时间:2017-01-27 00:30:19

标签: java reflection

背景:

我有一个从WSDL文件生成的数百个XXXFaultMsg类,它们都有一个方法getFaultMsg(),但它们直接从Exception扩展。我有一个带有参数Exception e的函数,其中e可能是其中一个XXXFaultMsg类的实例。

挑战:

如果它是XXXFaultMsg的实例,我想在e上调用getFaultMsg()

我写了if (e.getClass().getName().endsWith("FaultMsg"))来检测e是否是XXXFaultMsg的一个实例。那么如何声明一个类型为XXXFaultMsg的var并将其投射到它并在其上调用getFaultMsg()

P.S。我不想构建一个长if (e instanceof XXXFaultMsg)列表,因为有超过100个XXXFaultMsg类。

1 个答案:

答案 0 :(得分:3)

假设您有一个不带args的方法:

Method methodToFind = null;
if (e.getClass().getName().endsWith("FaultMsg")){
    try {
      methodToFind = e.getClass().getMethod("getFaultMsg", (Class<?>[]) null);
    } catch (NoSuchMethodException | SecurityException e) {
      // Your exception handling goes here
    }
}

如果存在则调用它:

if(methodToFind == null) {
   // Method not found.
} else {
   // Method found. You can invoke the method like
   methodToFind.invoke(e, (Object[]) null);
}