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

乔丹乔丹诺夫

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Java反射获取方法的类型化返回

如何在具有泛型参数和返回类型方法的Java中使用反射获取类的实例?

如何使用Scala反射查找返回类型参数的方法的类型?

Java:获取嵌套参数化类型的内部类型(反射)

如何通过Scala / Java方法中的反射获取参数名称和类型?

使用反射获取具有原始类型参数的类的方法

使用反射获取Java中通用参数的类型

如何使用Java反射获取类型参数值?

如何获取模板参数方法的返回类型?

如何通过Java中的反射获取方法参数的值?

标量反射,获取超类的类型参数

C# 使用反射从方法返回类型的泛型参数中检测可空引用类型

通过反射和返回类型查找方法

如何在反射类方法(PHP 5.x)中获取参数类型?

如何使用Scala反射获取方法的返回类型字符串?

通过反射获取带有“in”参数的方法

使用反射从Java类获取类型类

使用Java反射获取类数组的类型

Java如何通过以原始类型作为参数的反射来调用方法

方法参数[...]可接受的Java方法返回类型

如何使用反射获取Func <T>的返回类型?

Java反射-使用int [] []参数调用方法

Java反射,其中方法参数是接口

Java中类型安全的方法反射

我可以使用Java反射获取方法参数名称吗?

如何在java反射中从可变数量的参数中获取方法

是否有某种方法可以获取OCaml中的c#或java的反射类型的值?

Java泛型-获取一种方法以返回与第一个参数相同的类型

从 .jar 到 Python 获取 java 方法反射