- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对方法句柄的方法参数感到困惑。我首先构建了一个guardwithtest方法句柄,如下所示:
public class App
{
public static void trueTarget(String str, String own, String t){
System.out.println("This is true target "+str+" "+own + " "+t);
}
public static void falseTarget(String str, String own, String t){
System.out.println("This is false target " + str+" "+own +" "+t);
}
public static void main( String[] args ) throws Throwable
{
MethodHandle test = MethodHandles.publicLookup().findVirtual(String.class, "startsWith",
MethodType.methodType(boolean.class, String.class));
System.out.println((boolean)test.invokeExact("result", "res"));
MethodHandle target = MethodHandles.lookup().findStatic(App.class, "trueTarget", MethodType.methodType(void.class, String.class, String.class, String.class));
MethodHandle fallback = MethodHandles.lookup().findStatic(App.class, "falseTarget", MethodType.methodType(void.class, String.class, String.class, String.class));
MethodHandle gwd = MethodHandles.guardWithTest(test, target, fallback);
gwd.invokeExact("result", "data", "sijie");
}
}
对我来说,问题是如何将参数传递给三个方法句柄:test、trueTarget 和 faliover。1、invokeExact的第一个参数“result”作为接收者传递给测试守卫,第二个参数“data”传递给startWith:
String.startsWith(String)
"result" "data"
但这三个参数传递给 falseTarget 的方式如下:
falseTarget(String str, String own, String t)
"result" "data" "sijie"
那么,参数传递的规则是什么?它们如何与方法句柄引用的方法相匹配?
最佳答案
这出现在 findVirtual
的 Javadoc 中
When called, the handle will treat the first argument as a receiver and dispatch on the receiver's type to determine which method implementation to enter.
和你描述的一模一样。 static
方法没有接收器,因此 invokeExact
的所有参数都被视为该方法的参数。
关于java - MethodHandle InvokeExact 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28049332/
如何为像 int[]::new 这样的数组构造函数获取 MethodHandle? 这行不通: public static void main(String[] args) throws Throwa
我有一个项目在 Android Studio 或 Gradle 中构建时开始抛出此错误: com.android.tools.r8.ApiLevelException: MethodHandle.in
我正在尝试在我的 Android 应用程序中使用 SOAP 服务。我正在尝试关注 this guide .当我尝试运行我的应用时出现错误: Error: MethodHandle.invoke and
我正在 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
java.lang.invoke.MethodHandle 和 friend 允许通过一系列 combinators 生成适合 JIT 的运行时代码. 如何在 MethodHandles 中创建局部变
我正在努力思考如何有效地使用 MethodHandles,让我失望的一件事是尝试在调试期间执行 MethodHandles。这是一些示例代码,说明了我的问题。 public class Metric
是否可以将方法引用(例如 SomeClass::someMethod)转换为 MethodHandle 实例?我想要编译时检查的好处(确保类和方法存在)以及使用 MethodHandle API 来检
我正在尝试用 MethodHandle 替换反射调用,但可变参数似乎无法处理。 我的反射调用器目前看起来像这样: public class Invoker { private final Me
我正在研究 JDK 1.7 的新功能,但我无法理解 MethodHandle 的设计用途?我理解(直接)调用静态方法(以及在这种情况下直接使用核心反射 API)。我也理解(直接)调用虚拟方法(非静态,
假设我在给定类型(类/接口(interface))中有三个方法: public void foo(Integer integer); public void foo(Number number); p
鉴于此代码: MethodType mt = MethodType.methodType(void.class, DomainObject.class); NOOP_METHOD = RULE_MET
使用 Java 1.8.0_92,尝试运行 MethodHandles 的示例。 filterArguments() ,抛出以下异常: Exception in thread "main" java.
import java.lang.invoke.*; public class InvokeDynamicDemo { public static double doub
我有一个 Java 7 代码,我正在使用 MethodHanlde .代码是: import java.lang.invoke.MethodHandle; import java.lang.invok
我对方法句柄的方法参数感到困惑。我首先构建了一个guardwithtest方法句柄,如下所示: public class App { public static void trueTarget
MethodHandles.Lookup.defineClass在运行时从字节数组生成一个新类。 返回类在什么情况下可以被垃圾回收?它是否在与 Lookup 对象关联的类加载器的生命周期内保留,或者如
我是一名优秀的程序员,十分优秀!