是的,我知道有很多关于这个主题的文章,但并不是那么简单。
我有一个包装类,用于将参数一般地传递给方法并随后检索值。这个包装类(称为IDVariant
)有一个默认类型,它指示存储的变量的主要类型。
因此,我可以拥有:
IDVariant v = new IDVariant(1);
boolean b = v.booleanValue();
String s = v.stringValue();
int i = v.integerValue();
依此类推,但默认类型为int
,根据用于创建实例的参数的类型。
现在,如前所述,这个类在更大、更复杂的类中用作通用占位符。我需要创建一个工具来递归地解析类的超结构并在 XML 中重新创建这个结构。显然,要走的路是反射,到目前为止,我已经成功地重建了整个事物的结构。唯一的问题是,我还没有找到一种方法来找出 IDVariant 的默认类型,从而为 XML 树的每个变量提供正确的类型。
我尝试做的是检索get
每个类的每个属性的方法,然后调用它并检查每个 IDVariant 的默认类型。这似乎是一个好主意,但它不起作用:我得到了一个InvocationTargetException
,我认为这是由于我创建的用于调用该方法的类的实例实际上没有填充数据。这是我能给出的唯一合乎逻辑的解释。
如果有人有任何想法,我将不胜感激!:)
以下是示例代码片段:
// Edit of the code, as correctly indicated by cyon. Tha variable className is given.
Class<?> toParse = Class.forName(className);
Object o = toParse.newInstance(); // There is a default constructor with no values, the object is not null
Class cl = ... // given class
Class[] noparams = {};
String s = "getSomeValue";
Method method = null;
for(Method m : cl.getMethods()) {
if (m.getName().equals(s)) {
method = m;
break;
}
}
if (method != null) {
try {
Object idv = method.invoke(o, noparams); // exception occurs at this point
String type = decodeType((IDVariant)idv); // function which maps internal codes of IDVariant default type to primitive and internal types
return type;
} catch (InvocationTargetException ex) {
System.out.println(ex.getCause());
}
}
注意:该函数确实返回了一个 IDVariant 类型的变量,我已经检查了源代码。但是,我无法更改该代码,因为它来自自动生成它的外部工具。
先感谢您 :)
编辑:好的,所以我更好地查看了外部工具产生的源代码,这就是我收集的内容:
我正在调用一个示例方法,例如getSomeValue
. 在声明方法的类的源代码中,这里是方法的声明:
public IDVariant getSomeValue() { return GetPropDirect(externalValue); }
所以,也许它在内部试图调用另一个属于超类的方法,而我没有实例化超类。这可能是问题吗?如果是,是否有解决方法?
编辑2:根据要求,这是我得到的异常的堆栈跟踪:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at prove.Reflector.getImplicitType(Reflector.java:275)
at prove.Reflector.recurr(Reflector.java:134)
at prove.Reflector.ParseToXml(Reflector.java:69)
at prove.Main.main(Main.java:12)
Caused by: java.lang.NullPointerException
at com.progamma.doc.IDDocument.GetPropDirect(IDDocument.java:739)
at it.zerounoesse.Calcolo7302013.Contribuente.getSomeValue(Contribuente.java:70)
... 8 more