2

我有一个 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 本身没有实现 unwrap。

这是怎么回事?如何获取 NewProxyResultSet 并从中获取 OracleResultSet?

4

1 回答 1

4

我想出了一种获得内在价值的方法!这是一个黑客,但它的工作原理。如果有人知道获取内部价值的更便携的方法(例如使 unwrap 方法起作用),那么我很乐意这样做。

但是,事实证明 NewProxyResultSet 的“内部”变量被声明为受保护的。所以我只是在与 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;
}
}
于 2009-12-29T00:50:12.863 回答