我有一个 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/