我需要从一个不能导入的类中调用这个方法: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(耶!我知道)。
您请求的声明的方法排除了接收继承的方法的可能性。因此,如果WrappedPreparedStatementJDK6
从JBossWrapper
或类层次结构中的其他类继承方法,而不是自己声明它,则查找将失败。您应该使用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.htmlgetdeclardmethod不像getMethod那样遵循继承层次结构来查找方法。
由于方法是public
,我建议您使用getMethod
,您不需要知道实际实现该方法的类。
实际上你应该能够直接调用公共方法,但是我认为你必须使用反射是有原因的。