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



我需要从一个不能导入的类中调用这个方法:public T unwrap(class iface)

I'm try to do this:

 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 (. 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打开% 28 . lang . class % 29日

Update:我忘了说我们使用的是Java 1.5(耶!我知道)。

您请求的声明的方法排除了接收继承的方法的可能性。因此,如果WrappedPreparedStatementJDK6JBossWrapper或类层次结构中的其他类继承方法,而不是自己声明它,则查找将失败。您应该使用getMethod,它将为您提供方法,而不管它是在类层次结构中的哪个位置定义的,只要方法是public(这里就是这种情况)。

然而,因为它是在标准Java API Wrapper interface中定义的,所以根本不需要使用反射。如果st的编译时类型还不是PreparedStatement,您可以简单地调用((Wrapper)st).unwrap(PreparedStatement.class)

Javadoc中的类是

org.jboss.jca.adapters.jdbc.JBossWrapper

然而,你正在看的类是一个不同的类。

您正在查看的类没有unwrap方法。

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

getdeclardmethod不像getMethod那样遵循继承层次结构来查找方法。

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

实际上你应该能够直接调用公共方法,但是我认为你必须使用反射是有原因的。

相关内容

  • 没有找到相关文章

最新更新