Java Reflection:获取方法的返回参数的类型

时间:2013-09-10 15:00:10

标签: java reflection instantiation invocationtargetexception

是的,我知道有很多关于这个主题的文章,但并不是那么简单。

我有一个包装类,用于将参数一般传递给方法并随后检索值。此包装类(称为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

1 个答案:

答案 0 :(得分:0)

您的IDVariant类当然是实例化的,这就是您使用toParse.newInstance()方法所做的事情,但是由于您没有将实例化对象强制转换为其原始类类型然后对其进行初始化,因此异常概率,例如NullPointerEx。