- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
<分区>
我在将使用 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)
import java.lang.invoke.*; public class InvokeDynamicDemo { public static double doub
我对方法句柄的方法参数感到困惑。我首先构建了一个guardwithtest方法句柄,如下所示: public class App { public static void trueTarget
我花了一整天的时间来解决这个问题。我的问题是如何在实例上进行 MethodHandle.invokeExact 调用,其类类型在程序运行时动态加载。为了使问题更清楚,我在下面显示我的示例代码: Cla
Java 的 MethodHandle.invokeExact(Object...args) 采用可变长度的参数列表。但是,当我尝试传递 Object [] 数组而不是列表时,出现错误。见下文: pr
对于我的一个项目,我必须对构造函数进行动态调用。但由于这是 Java 7,我使用 java.lang.invoke 而不是“经典”反射 API。 代码: @ParametersAreNonnullBy
MethodHandle 类的描述中显示的示例在语句 mh.invokeExact("daddy",'d' ,'n') 带有以下描述:(CC)Ljava/lang/String;不能使用与 ([Lja
我有一个项目在 Android Studio 或 Gradle 中构建时开始抛出此错误: com.android.tools.r8.ApiLevelException: MethodHandle.in
我正在尝试调用一个 invoke 方法,但有一个我无法解释的错误。 我听说 Invoke Exact 方法必须返回,但即使那时它也不起作用。 public boolean exec(String id
我已经为 Java MethodHandle-API 创建了 2 个简单的类: public class Foo { private static int staticField; p
我正在尝试在我的 Android 应用程序中使用 SOAP 服务。我正在尝试关注 this guide .当我尝试运行我的应用时出现错误: Error: MethodHandle.invoke and
我试图检查是否可以使用 MethodHandle::invoke 或 MethodHandle::invokeExact 作为接受 MethodHandle 并返回通用输出的功能接口(interfac
这个问题在这里已经有了答案: InvokeExact on the object, whose type is dynamically loaded by classloader (2 个答案) 关
我正在 Android 中开发一个应用程序,我想在其中使用热敏打印机打印收据上的图像。 为了完成此任务,我在我的应用程序中添加了 escpos-coffee 包。 打印正在使用的图像导入java.im
我正在开发 android 原生应用程序,我已经为他们准备好了 图书馆项目包含这些应用程序的所有常用工具。 我正在使用 jfrog artifactory 导入我的库,并且运行良好;现在我想使用 gi
我有一个应用程序,当我将 android studio 更新到 3.4.2 版本并更新 gradle 时,我不得不强制更改一些库,例如 androidx 用于 appcompatibility 和注释
我正在开发一个 Android 应用程序(在我很新的 Android Studio 中),其中包含许多导入的外部 .jar的,模拟器中的开发很顺利,但是当我开始构建APK时,我得到了以下错误: FAI
实现 'org.apache.poi:poi:5.0.0' 当我使用 Run 'app' 在模拟器/手机上运行时,上述依赖项工作正常,但是 当我尝试构建 apk 时,出现以下错误。 com.andro
我是一名优秀的程序员,十分优秀!