[英]Calling a method with an generic parameter with Java reflection
我需要调用此方法:public T unwrap(Class iface)from a无法导入的类。
我正在尝试这样做:
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 /组织/ JBoss的/ JCA /适配器/ JDBC / JBossWrapper.html#解包%28java.lang.Class%29
更新 :我忘了说我们正在使用Java 1.5(是的!我知道)。
您正在要求一个声明的方法,该方法排除了接收继承的方法的可能性。 因此,如果WrappedPreparedStatementJDK6
从JBossWrapper
或类层次结构中的某些其他类继承该方法,而不是声明它本身,则查找将失败。 您应该使用getMethod
,无论该方法在类层次结构中的定义位置如何,它都将为您提供该方法,前提是该方法是public
(在这种情况下)。
但是,由于它是在标准Java API Wrapper
interface
定义的,因此根本不需要使用Reflection。 如果st
的编译时类型尚未为PreparedStatement
,则可以简单地调用((Wrapper)st).unwrap(PreparedStatement.class)
。
Javadoc中的类是
org.jboss.jca.adapters.jdbc.JBossWrapper
但是,您要查看的课程是不同的课程。
您正在查看的类没有解包方法。
getDeclaredmethod不会遵循继承层次结构来找到像getMethod那样的方法。
由于该方法是public
方法,因此建议您使用getMethod
,而无需了解实际实现该方法的类。
实际上,您应该能够直接调用public方法,但是我认为您有理由必须使用反射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.