gpt4 book ai didi

java - 使用 entityClass.newInstance() 创建的实例上的 invokeExact 导致 java.lang.invoke.WrongMethodTypeException?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:00:57 24 4
gpt4 key购买 nike

<分区>

我在将使用 newInstance 方法创建的实例传递给 invokeExact 方法时遇到问题。

我的方法看起来像这样

public <T extends BaseEntity> T getEntity(Class<T> entityClass) {

T entity;

try {
entity = entityClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}

for (Field field : map.get(entityClass).keySet()) {
if (get(field.getName()) != null) {
try {
MethodHandle methodHandle = map.get(entityClass).get(field);
methodHandle.invokeExact(entity, (String) get(field.getName()));
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
}

return entity;
}

方法是这样调用的

resource.getEntity(DemoEntity.class);

结束结果

Caused by: java.lang.invoke.WrongMethodTypeException: **expected (DemoEntity,String)void but found (BaseEntity,String)void**
at java.lang.invoke.Invokers.newWrongMethodTypeException(Invokers.java:349) ~[na:1.7.0_45]
at java.lang.invoke.Invokers.checkExactType(Invokers.java:360) ~[na:1.7.0_45]
at com.me.api.entity.request.DemoEntityRequest.getEntity(DemoEntityRequest.java:49) ~[classes/:na]
... 27 common frames omitted

如果我使用 invoke 而不是 invokeExact,代码可以正常工作,但我很想知道是什么导致了问题,即为什么 invokeExact 方法将 T 实体视为其父类(super class)类型而不是 DemoEntity?

编辑:

这是一个完整的工作示例

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Field;

public class InvokeExactTest {

public static void main(String[] args) {
new InvokeExactTest().test(Demo.class);
}

public <T extends Base> void test(Class<T> clazz) {
Field field = clazz.getDeclaredFields()[0];
field.setAccessible(true);
MethodHandle setter = null;
try {
setter = MethodHandles.lookup().unreflectSetter(field);
} catch (IllegalAccessException e) {
e.printStackTrace();
}

try {
Demo demo1 = new Demo();
setter.invokeExact(demo1, "Demo 1");
} catch (Throwable e) {
e.printStackTrace();
}

try {
T demo2 = clazz.newInstance();
setter.invokeExact(demo2, "Demo 2");
} catch (Throwable e) {
e.printStackTrace();
}
}

public static class Base {
}

public static class Demo extends Base {
private String name;
}
}

演示 1 会工作,演示 2 会失败

    java.lang.invoke.WrongMethodTypeException: expected (Demo,String)void but found (Base,String)void
at java.lang.invoke.Invokers.newWrongMethodTypeException(Invokers.java:294)
at java.lang.invoke.Invokers.checkExactType(Invokers.java:305)
at InvokeExactTest.test(InvokeExactTest.java:30)
at InvokeExactTest.main(InvokeExactTest.java:8)

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com