java – 是否可以将方法引用转换为MethodHandle?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 是否可以将方法引用转换为MethodHandle?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1880字,纯文字阅读大概需要3分钟。
内容图文
是否可以将方法引用(例如SomeClass :: someMethod)转换为MethodHandle实例?我希望编译时检查的好处(确保存在类和方法)以及使用MethodHandle API反省方法的能力.
用例:当且仅当请求未被特定方法触发时(以避免无限递归),我才需要执行代码.我想要一个编译时检查以确保类/方法存在但运行时检查以将调用者与方法进行比较.
那么回顾一下:是否可以将方法引用转换为MethodHandle?
解决方法:
好吧,如果你能承受额外的开销和安全隐患,你可以使用Serializable功能接口并解码方法参考实例的序列化形式,以找到像this answer中演示的目标或this question and its answers再次提出的目标.
但是,您应该重新考虑您的软件设计. “避免无限递归”不应该通过解码某种参数对象来修复,尤其是如果你的假设是,这个实际的参数值代表你的方法的调用者.你怎么会强迫这种奇怪的关系?
即使是简单的代码更改,如引用委托给其他方法的方法也会破坏您的检查.这是一个简单的示例,显示了您的方法的细微问题:
public class SimpleTest {
public static void main(String... arg) {
run(SimpleTest::process);
}
static void run(BiConsumer<Object,Object> c) {
c.accept("foo", "bar");
}
static void process(Object... arg) {
Thread.dumpStack();
}
}
运行此程序时,它将打印如下内容:
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1329)
at SimpleTest.process(SimpleTest.java:16)
at SimpleTest.lambda$MR$main$process$a9318f35$1(SimpleTest.java:10)
at SimpleTest$$Lambda$1/26852690.accept(Unknown Source)
at SimpleTest.run(SimpleTest.java:13)
at SimpleTest.main(SimpleTest.java:10)
显示生成的实例中的方法引用不是预期的SimpleTest :: process,而是SimpleTest :: lambda $MR $main $process $a9318f35 $1,它最终会调用进程.原因是某些操作(此处为varargs处理)不是由生成的接口实例执行,而是由合成方法执行,就像您编写的run((a,b) – > SimpleTest.process(a,b)).唯一的区别是合成方法的名称.
你不应该依赖这种脆弱的内省来设计软件.如果你想避免递归,一个简单的ThreadLocal标志告诉你是否已经在你的特定方法中,这将完成这项工作.但是,可能值得问问自己为什么你的API首先会引发无休止的递归;似乎有一些根本错误的东西……
内容总结
以上是互联网集市为您收集整理的java – 是否可以将方法引用转换为MethodHandle?全部内容,希望文章能够帮你解决java – 是否可以将方法引用转换为MethodHandle?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。