我有一个ResultSet对象,我需要将其转换为OracleResultSet,以便我可以在其上调用getOPAQUE(String)方法。我正在使用c3p0作为我的连接池。问题是c3p0将ResultSets包装在NewProxyResultSet对象中。
这应该不是问题,因为我应该能够像这样调用ResultSet上的unwrap:
rs.unwrap(OracleResultSet.class)
然而,这不起作用。它实际上抛出了一个AbstractMethodError:
java.lang.AbstractMethodError: com.mchange.v2.c3p0.impl.NewProxyResultSet.unwrap(Ljava/lang/Class;)Ljava/lang/Object;
它包含一个堆栈跟踪,但它没有用,因为堆栈跟踪的顶行只指向我调用unwrap方法的确切行。这似乎表明NewProxyResultSet本身没有实现解包。
这是怎么回事?如何从中获取NewProxyResultSet并从中获取OracleResultSet?
答案 0 :(得分:4)
我找到了获得内在价值的方法!这是一个黑客,但它的工作原理。如果有人知道一种更便携的获取内在价值的方式(比如让解包方法有效),那么我很乐意这样做。
但事实证明,NewProxyResultSet的“inner”变量被声明为protected。所以我只是在与NewProxyResultSet相同的包中创建一个类,并使用它来获取内部值,如下所示:
package com.mchange.v2.c3p0.impl;
import java.sql.ResultSet;
/**
* This is a sneaky way to get at the inner ResultSet of NewProxyResultSet. It marks the variable as protected,
* so here I just make a class in the same package and get the value out.
*
*/
public class C3P0ResultSetPeeker
{
public static ResultSet getInnerFrom(NewProxyResultSet rs) {
return rs.inner;
}
}