java - 使用内部类的 JDBI

标签 java reflection jdbi

我有一个 POJO,其中包含一个内部(非静态)类,因为它共享父级 id

public Long getId() {
   return Parent.this.getId();
}

现在我尝试在 JDBI 中映射这些,但 JDBI 似乎无法实例化内部类?

    Caused by: java.lang.InstantiationException: com.xxxx.Parent$Child
    at java.lang.Class.newInstance(Class.java:427)
    at org.jdbi.v3.core.mapper.reflect.FieldMapper.construct(FieldMapper.java:214)
    ... 38 more
Caused by: java.lang.NoSuchMethodException: com.xxxx.Parent$Child.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    ... 39 more

我对内部类的经验非常缺乏——我在这里错过了什么?或者这只是 JDBI 库的一个缺陷?

最佳答案

非静态内部类只能引用外部类的实例来构造。例如,考虑一下这个类:

public class Outer {

    class Inner {}

    void implicitReferenceToThis() {
        new Inner();
    }

    void explicitReferenceToThis() {
        this.new Inner();
    }

    static void noReferenceToOuter() {
        // new Inner(); // doesnt compile
    }

    static void explictReferenceToOuter() {
        new Outer().new Inner();
    }
}

虽然在第一个方法中,Inner 看起来有一个无参数构造函数,但它实际上是隐式引用this。您可以看到这一点,因为您无法在第三个(静态)方法中使用相同的代码。

确实,语法可能看起来有点奇怪,但第二个和第四个方法演示了如何在显式对象上调用构造函数。

这与您对堆栈跟踪的疑问有何关系。

at java.lang.Class.newInstance(Class.java:427)

看起来代码正在尝试使用 newInstance() 实例化 Outer$Inner,但无法工作,因为没有对 Outer$Inner 实例的引用>外部

我不确定我是否期望反射映射器能够处理开箱即用的内部类,因此我不会说这是 JDBI 的缺陷,但您可能需要与自定义映射器或扩展进行一些争论反射映射器让它为您工作。

关于java - 使用内部类的 JDBI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58422644/

相关文章:

java - JDBI 一对多连接和映射

java - Tinkerpop 遍历中不匹配

java - Eclipse RCP 中的 Firefox

java - 使用反射没有性能问题

c# - Dynamic Func<> for Dapper query map

postgresql - 将查询结果转换为 CSV

java - JDBI Transactional .inTransaction() 具有 void 返回类型?

java - 这段非常简单的代码有什么问题

java - 如何通过java向Asterisk PBX注册SIP客户端

c# - 复制两个具有不同 namespace 的相同对象(递归反射)