我需要调用这个方法: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中)
更新:我忘了说我们正在使用Java 1.5(是的!我知道)。
答案 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
然而,你所看的课程是另一个班级。
您所看到的课程没有解开方法。
getDeclaredmethod不遵循继承heirarchy来查找像getMethod那样的方法。
由于方法是public
,我建议你使用getMethod
,你不需要知道实际实现该方法的类。
实际上你应该可以直接调用public方法,但我认为你必须使用反射。