reflection 相关问题

反射是程序在运行时观察和/或修改其结构和/或行为的能力。反射高度依赖于实现代码语言 - 请标记使用此标记时使用的代码语言。

MethodHandle.invokeExact() 出现 WrongMethodTypeException,但没有参数且返回类型相同

我在 AWS Lambda 上使用 Java 17。我有一个带有方法 bar() 的接口 Foo,返回一个 CompletableFuture>: 公共接口 Foo { 公共 CompletableFuture 我在 AWS Lambda 上使用 Java 17。我有一个接口 Foo,带有方法 bar(),返回 CompletableFuture<Map<Bar, Long>>: public interface Foo { public CompletableFuture<Map<Bar, Long>> bar(); } 在 MyProcessor 类中,我有一个对 Foo 实现的实例引用,即 FooImpl: class MyProcessor { private final Foo foo; MyProcessor() { foo = goGetFooImpl(); } void doSomething() { … } } 最后在 MyProcessor.doSomething() 中,我查找 Foo.bar() 方法并尝试使用方法句柄调用它(为了清楚起见,省略了异常处理): //filter out the only method with the name "bar" Method barMethod = foo.getClass().getDeclaredMethods().…; MethodHandle = MethodHandles.lookup().unreflect(barMethod); CompletableFuture<?> result = (CompletableFuture<?>)methodHandle.invokeExact(foo); 错误消息很奇怪: java.lang.invoke.WrongMethodTypeException: expected (FooImpl)CompletableFuture but found (Foo)CompletableFuture 我意识到参数和返回类型必须准确。在这种情况下,没有任何争论。据我了解, MethodHandle.invokeExact() 的泛型类型会在运行时被删除;因此在这种情况下,具体返回类型是相同的。那么问题出在哪里呢?错误消息中提到 CompletableFuture 和 (Fooimpl) 是什么意思?目标类型如何影响 (Foo) 的类型?我意识到 CompletableFuture 方法是在 bar() 上声明的,但是在 Foo 实例的类上查找该方法。但为什么这会成为一个问题呢?从文档中我了解到 FooImpl 适用于虚拟方法。我可以在这里调用 MethodHandle.invokeExact(),效果很好,但不行 methodHandle.invoke(foo)。我正在做的事情有什么不“准确”的地方?有谁知道错误消息是什么意思?我发现 MethodHandle 强制转换返回类型 这似乎是相关的,但我仍然没有得到它。 methodHandle.invokeExact(foo) 是CompletableFuture。从什么时候开始有CompletableFuture和(Foo)CompletableFuture这样的东西了?为什么它们会不同? (FooImpl)CompletableFuture 实际上意味着参数的静态类型必须与 MethodHandle 的类型完全匹配。 invokeExact 和 Foo 不是同一类型。另请参阅 FooImpl 的文档: invokeExact 调用点的符号类型描述符必须 与该方法句柄的类型完全匹配。不允许进行任何转换 参数或返回值。 invokeExact的符号描述符是从调用站点的参数和返回值的静态类型派生的。在您的情况下,即 invokeExact,采用 1 个类型为 (Foo)CompletableFuture 的参数并返回 Foo(您还可以使用 CompletableFuture 检查类型描述符来反汇编类文件)。另请参阅有关签名多态性的文档部分:https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/lang/invoke/MethodHandle.html#sigpoly javap 自动应用从 invoke 到 Foo 的类型转换,这样就可以了。如果您仅使用 FooImpl 调用 MethodHandle 一次就可以了。如果您打算多次调用它,您可以将接收器的类型删除为 invoke 以避免类型转换:Foo

回答 1 投票 0

字段存在,但 NoSuchFieldException

我有简单的代码,我尝试获取字段的签名: 导入 java.lang.reflect.Field; 导入java.lang.reflect.Method; 公共类主要{ 静态类测试{ int hi = 1; ...

回答 1 投票 0

如何从动态代理显式调用默认方法?

由于 Java 8 接口可以有默认方法。 我知道如何从实现方法中显式调用该方法,即 (请参阅在 Java 中显式调用默认方法) 但我该怎么办

回答 8 投票 0

反射数组如何实现类型安全?

Util 数组代码 int 数组大小=5; Object[] arr=(Object[])Array.newInstance(int.class,arraySize); Array.set(arr,0,0); Array.set(arr,1,1); Array.set(arr,2,2); Array.set(arr,3,"Drashti"); 为...

回答 1 投票 0

检查KFunction<*>是否是扩展函数/实例函数/对象函数/顶级函数?

我如何检查 KFunction 是否是上述函数类型之一?

回答 1 投票 0

一个周末光线追踪中的朗伯反射是如何工作的?

我已经开始在一周内实施光线追踪。我已经走得很远了,但当我决定回顾过去时,有些事情并不适合我。为什么这部分叫True Lambe...

回答 1 投票 0

使用 System.Reflection.Emit 在枚举字段上创建 DescriptionAttribute

我有一个字符串列表,它们是枚举值的候选者。他们是 不要发送差异 500行 1000行 5000行 发送整个差异 问题是空格、特殊字符......

回答 2 投票 0

在c#中使用反射向对象添加属性

我想创建一个接收 3 个字符串作为参数并返回一个对象的方法,该对象包含它们引用这些字符串的三个属性。 没有要复制的“旧对象”...

回答 3 投票 0

PHP8 反射比没有反射的 PHP7 性能更差吗

我已经从旧的 php 7.4 脚本中重新编写了代码。我发现我的代码比旧版本更慢 我的旧模型从方法 toArray 导出数据 他的代表是这样的 公共职能

回答 1 投票 0

查找当前运行文件的路径[重复]

如何找到当前运行的Python脚本的完整路径?也就是说,我必须做什么才能实现这一目标: $密码 /tmp $ python baz.py 从 /tmp 运行 文件是 baz.py

回答 8 投票 0

java 17,ReflectionHelpers.setStaticField 不适用于最终字段

Android项目的单元测试,需要使用不同的BuildConfig.DEBUG值进行测试 BuildConfig 类将 DEBUG 作为最终类 公共最终类 BuildConfig { 公共静态最终布尔值 DEBUG =

回答 1 投票 0

继承类的 C# 静态构造函数

我有一个包含大约 100k XML 配置文件的项目,用于管理测试设备。为了使文件更容易更新,我希望能够将它们移植到 Excel、Access 等。我已经

回答 1 投票 0

动态删除事件处理程序的解决方案(使用反射)。有更好的方法吗?

我需要从从我没有代码的 dll 加载的控件中删除事件处理程序。因为似乎没有“官方”(即 .NET Framework 的公共方法支持......

回答 1 投票 0

C# 在 where 类型约束上使用反射的递归

我正在尝试通过类进行递归,但我不知道如何使用类型约束来调用它。 我的问题主要是我不知道如何调用递归并在

回答 2 投票 0

实体框架 - 按名称获取实体

我有以下代码(示例): 公共动态GetData(字符串名称) { 使用(var ctx = GetObjectContext()) { 开关(名称) { 案例“实体1”: 返回...

回答 3 投票 0

获取实现类类型

我有以下代码 公共抽象类abstract1 { 公共无效测试1() { // 做一点事 } } 公共类class1:抽象1 { } 公开课Class1Test { 公共空间

回答 1 投票 0

使用-webkit-box-reflect时如何设置反射的不透明度?

我一直在 Chrome 中使用 -webkit-box-reflect 属性,并且可以使用以下代码实现淡入淡出的反射(这是来自 Webkit 博客的示例代码): -webkit-box-reflect: 乙...

回答 2 投票 0

JobRunr:ReflectionUtils.newInstance 中的 InstantiationException

我正在使用 JobRunr 6.3.0 来调度 Java 中的重复后台作业,并且遇到反射访问问题。 我正在尝试有一个抽象类来实现作业调度l...

回答 1 投票 0

调用 ImmutableArray<T> Create<T>(params T[]? items) 动态给定类型为 T[] 的对象

我正在尝试调用创建一个不可变数组,给定一个实际上具有 T[] 类型的对象变量。如何使用反射来做到这一点。问题是 ImmutableArray.Create 有...

回答 1 投票 0

C# 如何从字符串变量创建对象名称

我有一个带有一个文本框(Pname)和一个按钮的Windows窗体。 我有一个名为 Player 的类,没有构造函数。 当用户在文本框中输入文本(例如 John)并单击按钮时,系统将创建...

回答 6 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.