使用带有Java反射的泛型参数调用方法

时间:2015-07-21 13:56:14

标签: java reflection jboss

我需要调用这个方法:public T unwrap(Class iface)来自我无法导入的类。

我试图这样做:

 Class jbossWrappedSt = Class.forName("org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6");

 Method metodoUnwrap = jbossWrappedSt.getDeclaredMethod ("unwrap", new Class[]{Class.class});
 Object val = metodoUnwrap.invoke (st, new Object[] {PreparedStatement.class});

但是因为NoSuchMethodException异常而失败:

  

java.lang.NoSuchMethodException:   org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6.unwrap(java.lang.Class中)

类javadoc: https://repository.jboss.org/nexus/content/unzip/unzip/org/jboss/ironjacamar/jdbc-local/1.0.28.Final/jdbc-local-1.0.28.Final-javadoc.jar-unzip/org/jboss/jca/adapters/jdbc/JBossWrapper.html#unwrap%28java.lang.Class%29

更新:我忘了说我们正在使用Java 1.5(是的!我知道)。

2 个答案:

答案 0 :(得分:1)

您要求使用声明的方法,该方法无法接收继承的方法。因此,如果WrappedPreparedStatementJDK6从类JBossWrapper或类层次结构中的某个其他类继承方法而不是自己声明它,则查找将失败。您应该使用getMethod,它将为您提供方法,无论它在类层次结构中的位置如何定义,只要方法为public就是这种情况。

尽管如此,由于它是在标准Java API Wrapper interface中定义的,因此根本不需要使用Reflection。如果编译时类型st尚未PreparedStatement,则只需调用((Wrapper)st).unwrap(PreparedStatement.class)

答案 1 :(得分:1)

Javadoc中的类是

org.jboss.jca.adapters.jdbc.JBossWrapper

然而,你所看的课程是另一个班级。

您所看到的课程没有解开方法。

https://repository.jboss.org/nexus/content/unzip/unzip/org/jboss/ironjacamar/jdbc-local/1.0.28.Final/jdbc-local-1.0.28.Final-javadoc.jar-unzip/org/jboss/jca/adapters/jdbc/jdk6/WrappedPreparedStatementJDK6.html

getDeclaredmethod不遵循继承heirarchy来查找像getMethod那样的方法。

由于方法是public,我建议你使用getMethod,你不需要知道实际实现该方法的类。

实际上你应该可以直接调用public方法,但我认为你必须使用反射。