【发布时间】:2019-05-18 00:16:40
【问题描述】:
在 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”?
【问题讨论】:
-
您是否考虑过使用比
Runnable更具体的接口,以及返回您实际需要的方法?您将要使用的反射代码类型可能不太适合生产代码,因为您正在对传入的Runnable强制执行隐藏要求(即作为 lambda 并捕获了一些变量)。 -
@DidierL:如果你的意思是
SomePrintingClass可以实现这个“更具体”的接口,我就做不到。假设我无法更改SomePrintingClass的定义中的任何内容,我只能依靠我在 inspect() 方法中得到的内容。但是,我可能会使用 Runnable 以外的其他接口(创建我自己的) - 可以更改inspect方法的签名,但这可能不会简单地解决问题。关于“隐藏的要求”,我同意,但实际上在这种情况下,有很高的机会访问对象和参数是可以的。我不需要 100% 确定。 -
是的,我说的是使用比
Runnable更具体的东西。如果你这样做,你就不需要任何反思。 -
题主和正文不一致:题主问的是“对象和方法”,而正文问的是“对象和方法的参数”,这完全不一样.究竟是什么意思?
-
@Hans-PeterStörr:有权访问 Method 将授予访问其参数的权限。这就是我问方法的原因。不过,这只是一个标题。描述中描述了问题的意图。访问参数的值是最终的意图,但如果我们超越这一点,那就更好了。
标签: java reflection lambda java-8