是的,我知道关于该主题的文章很多,但这并不是那么简单。
我有一个包装器类,该包装器类通常用于将参数传递给方法并随后检索值。包装器类(称为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
IDVariant
当然,您的类是实例化的,这就是您使用toParse.newInstance()
方法所做的事情,但是由于您没有将实例化的对象强制转换为其原始类类型,然后对其进行初始化,因此发生异常的可能性很大,例如NullPointerEx。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句