繁体   English   中英

使用Java反射调用具有通用参数的方法

[英]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(是的!我知道)。

您正在要求一个声明的方法,该方法排除了接收继承的方法的可能性。 因此,如果WrappedPreparedStatementJDK6JBossWrapper或类层次结构中的某些其他类继承该方法,而不是声明它本身,则查找将失败。 您应该使用getMethod ,无论该方法在类层次结构中的定义位置如何,它都将为您提供该方法,前提是该方法是public (在这种情况下)。

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

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/组织/ JBoss的/ JCA /适配器/ JDBC / JDK6 / WrappedPreparedStatementJDK6.html

getDeclaredmethod不会遵循继承层次结构来找到像getMethod那样的方法。

由于该方法是public方法,因此建议您使用getMethod ,而无需了解实际实现该方法的类。

实际上,您应该能够直接调用public方法,但是我认为您有理由必须使用反射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM