我最近使用了很多方法引用和 lambda,并且想知道在运行时是否可以打印以屏幕 lambda 的源(即它的名称),只是出于调试原因。我认为可以使用反射,通过在 getName() 中调用 getClass() 来实现,但我找不到用于查找原始源引用名称的方法。
我有一个功能界面,例如:
@FunctionalInterface
public interface FooInterface {
// function etc etc irrelevant
public void method();
public default String getName() {
// returns the name of the method reference which this is used to define
}
}
然后假设我希望测试运行该界面,并将功能界面的源代码打印到屏幕上。
public static void doStuff(FooInterface f) {
// prints the lambda name that is used to create f
System.out.println(f.getName());
// runs the method itself
f.method();
}
所以如果我这样做:
doStuff(Foo::aMethodReference);
它应该在屏幕上打印类似:“方法引用”的内容,这样我就可以知道在运行时正在运行哪些方法,以什么顺序运行等。
考虑到 lambda 不完全是对象,我很怀疑这是可能的,但是嘿,我想可能有一个解决方法。此外,eclipse调试工具只是说它是一个lambda,没有任何其他信息,lambda是否保留任何这些信息?或者在运行时全部丢失?
干杯。 (如果有什么区别的话,我正在使用 JDK 11)
正如你所说,你只需要这个用于调试目的,这里有一个技巧(即肮脏的黑客),它可以让你做你想做的事。
首先,你的功能接口必须是Serializable
:
@FunctionalInterface
public interface FooInterface extends Serializable {
void method();
}
现在,您可以使用这个无记录的、内部实现相关的和风险极大
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)