Java 8 - 如何访问封装为 lambda 的对象和方法

2023-11-25

在 Java 中,您可以“捕获”“对象上的方法调用”作为 Runnable,如下例所示。

稍后,访问 Runnable 的这个实例,是否可以实际访问“捕获的”对象和被调用方法的方法参数(如果可能,这可能需要通过反射来完成)。

例如:

class SomePrintingClass {
  public void print(String myText) {
    System.out.println(myText);

  }
}


public class HowToAccess {
  public static void main(String[] args) throws Exception {
    final String myText = "How to access this?";

    final SomePrintingClass printer = new SomePrintingClass();

    Runnable r = () -> printer.print(myText); // capture as Runnable

    inspect(r);
  }


  private static void inspect(Runnable runnable) {
    // I have reference only to runnable... can I access "printer" here

  }


}

是否可以在“inspect”方法中访问(可能通过反射)“printer”对象和作为参数传递的“myText”?


这是可能的,因为捕获的引用被转换为可运行的字段(与所有匿名类一样)。然而,名称将不一致。

我通过测试发现你需要做myText non-final,否则它将被视为编译时间常数和内联(并且不能作为字段访问):

private static void inspect(Runnable runnable) throws Exception {       
    for(Field f : runnable.getClass().getDeclaredFields()) {
        f.setAccessible(true);
        System.out.println("name: " + f.getName());
        Object o = f.get(runnable);
        System.out.println("value: " + o);
        System.out.println("class: " + o.getClass());
        System.out.println();
    }
}

Prints:

name: arg$1
value: test.SomePrintingClass@1fb3ebeb
class: class test.SomePrintingClass

name: arg$2
value: How to access this?
class: class java.lang.String
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8 - 如何访问封装为 lambda 的对象和方法 的相关文章

  • 如何从 Play WSClient 的字符串创建 WSResponse 对象

    文档 https www playframework com documentation 2 4 x JavaTestingWebServiceClients Mock the web service建议使用模拟Web服务测试基于WSCli
  • Quarkus 不以编程方式选择 bean

    我试图以编程方式选择 bean 但 quarkus 不会注入 bean 并引发异常 不支持吗 public enum ReportType ONE TWO Qualifier Retention RUNTIME Target METHOD
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • JTextField 和 JTextArea

    JTextField 和 JTextArea 有什么不同 是否可以在一个班级中使用这两个班级 总之 JTextField 是单行文本字段 而 JTextArea 可以跨越多行 文档中清楚地解释了这些差异 文本区 http docs orac
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • 关于Java泛型的一些问题

    假设我有以下接口和实现类 interface Foo
  • maven 无法下载 jacoco 0.7.10-SNAPSHOT jar

    我对此感到困惑 我的 pom xml 中有这个
  • 正则表达式在 Velocity 模板中不起作用

    我在 Test java 中尝试过这个 String regex lt s br s s gt String test1 lt br gt System out println test replaceAll regex 但是当我在速度模板
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • 使用 HTTPServletRequestWrapper 包装请求参数

    我有一个可以验证 授权 REST 调用的过滤器 该过滤器需要访问请求参数 因此我为此编写了一个自定义 HTTPServletRequestWrapper import java util Collections import java ut
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 传递 Android DialogFragment 参数时,onCreateDialog 捆绑参数意外为 null

    我正在尝试使用 DialogFragment 在 Android 中显示一个基本对话框 并使用对话框消息的参数 如中所述StackOverflow线程 https stackoverflow com questions 15459209 p
  • 如何将库添加到 LIBGDX 项目的依赖项 gradle

    一切都在问题中 我已经尝试了在 SO 和其他网站中找到的所有答案 但没有运气 这就是我迄今为止尝试过的 adding compile fileTree dir lib include jar 到我的 build gradle adding

随机推荐

  • 在代码隐藏中模拟用户

    我想在代码中模拟特定用户以在远程计算机上执行一些文件操作 我遇到的问题是我无法让模拟工作 我正在使用此处找到的 Microsoft 文章中的代码 如何在 ASP NET 应用程序中实现模拟 我想要有关如何 在哪里开始调试过程的指导 这是我的
  • OWIN Cookie 与 FormsAuthentication

    与 Forms Authentication 基于 cookie 的身份验证相比 使用基于 OWIN cookie 的身份验证来开发 MVC Web 应用程序有什么主要优势吗 我问的原因是我不会使用任何基于实体框架的挂钩进行 OWIN 身份
  • Windows 服务和桌面应用程序之间的通信

    我想在 Windows 7 上的 Windows 服务和桌面应用程序之间创建通信 我读到命名管道是两个进程之间通信的一种方式 我可以将它们用于我的目的吗 确保您可以使用命名管道 WCF 许多其他 IPC 方法 有关堆栈溢出问题中的命名管道示
  • 在 Three.js 着色器中使用灯光

    我正在尝试从 Three js 中的着色器访问场景的灯光 这个问题几乎是重复的Three js ShaderMaterial 灯光问题但对该问题的评论并不能帮助我解决问题 这是顶点着色器 if NUM DIR LIGHTS gt 0 str
  • ASPxComboBox - 如何设置所选项目?

    我在用着 ASPx组合框 问题是如何从后面的代码设置 selectedValue 如果我的html是这样的
  • LogisticRegression:未知标签类型:在 python 中使用 sklearn 的“连续”

    我有以下代码来测试 sklearn python 库的一些最流行的 ML 算法 import numpy as np from sklearn import metrics svm from sklearn linear model imp
  • pandas DataFrame to_html 中的粗体列

    我试图用一个粗体列返回 df to html 我只尝试过 df pd DataFrame important column 1 2 3 4 dummy column 5 6 7 8 def some function df apply la
  • 将项目添加到任务栏应用程序菜单

    我有一个申请 我想通过 C 将我的特定项目添加到右键单击应用程序的任务栏菜单中 我想添加永久项目和临时项目 如果我没有让你明白 这就是我正在谈论的菜单 此功能称为 JumpList 适用于 Windows 7 它是 Microsoft AP
  • Android Studio - 如何使用 ARM 而不是 HAXM 制作 AVD?

    我是 Android Studio 的新手 我的计算机不支持 HAXM 因此不允许我安装它来用于虚拟化 在该网站上的一些类似问题中 人们提到使用 ARM 而不是 HAXM 设置虚拟设备 我怎样才能做到这一点 在 AVD 管理器中 所有预制硬
  • TListView:如果添加列,VCL 会丢失列的顺序

    我正在尝试在 TListView 中的现有列之间添加一列 因此 我在末尾添加新列 并通过将其索引设置为指定值来移动它 这是有效的 直到添加另一个新列 我做了什么 在最后一个位置添加列 Columns Add 并在最后一个位置添加子项 Sub
  • android - 我如何使用“android:layoutDirection”?

    看来android 4提供了 机器人 布局方向 对于线性布局和 机器人 文本方向 对于 textView 但是当我选择它们时 我收到一个编译错误 它无法识别它们 error No resource identifier found for
  • 为什么当我按 Enter 键时,

    我只是添加一个click我的事件处理程序
  • 如何获取字符串 C# 中某个索引之后的所有内容

    假设我有字符串 MyNamespace SubNameSpace MyClassName 如何提取最后一个句点 MyClassName 之后的所有内容 Use 字符串 子字符串 and String LastIndexOf方法 string
  • Switch 语句和数字范围

    如何在 as3 中编写 switch 语句以使 case 适用于整个数字范围 if mcPaddle visible true switch score case 10 10 to 100 myColor color 0x111111 br
  • 使用 React Native Google Maps Directions 包自动启动导航

    我有一个要求 在加载谷歌地图应用程序时 必须自动启动导航 当前场景 它显示路线 但用户必须单击start开始导航 我找不到与之相关的任何标志 找到这篇文章 其中显示了谷歌地图中使用的标志 谷歌地图官方文档显示将其用作dir action n
  • 如何删除R中的空列?

    我有一个 CSV 文件 Identity Number Data Result Add 1 4 55 92 62 3 7 43 12 74 7 3 58 52 64 0 6 10 22 96 3 8 13 92 22 如何删除R中的空列 所
  • 修补 Magento 1.7.1 Hunk #1 时出错

    我看到最后一个Critical Reminder我的 Magento 仪表板 v 1 7 0 2 中的通知 2 important security patches SUPEE 5344 and SUPEE 1533 因此 我在其他 Mag
  • 错误 ::0 找不到引用的切入点注释

    我正在尝试创建一个方面来监视某些方法的时间执行 当我尝试运行测试时 出现以下错误 Caused by java lang IllegalArgumentException error at 0 can t find referenced p
  • 选择不同的 mongodb C#

    我必须从简单的 mongo db 数据库中选择不同的记录 我有很多简单的记录 这些记录如下所示 word some text 我的代码很简单 const string connectionString mongodb localhost v
  • Java 8 - 如何访问封装为 lambda 的对象和方法

    在 Java 中 您可以 捕获 对象上的方法调用 作为 Runnable 如下例所示 稍后 访问 Runnable 的这个实例 是否可以实际访问 捕获的 对象和被调用方法的方法参数 如果可能 这可能需要通过反射来完成 例如 class So