Nic*_*ick 1 java reflection lambda
我对 lambda 表达式很陌生,所以请耐心等待。假设我有一个带有单个抽象函数的接口:
public interface IAbsFunc {
public abstract void absFunc(int x);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以将 lambda 表达式存储在变量中:
public class Lambda {
public static void main(String[] args) {
IAbsFunc obj = (int x) -> System.out.println(x);
obj.absFunc(3);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,这就像将方法存储在变量中。但是,这已经可以通过 java.lang.reflect 完成:
public class Lambda {
public static void main(String[] args) throws Exception {
Method obj = PrintStream.class.getDeclaredMethod("println", int.class);
obj.invoke(System.out, 3);
}
}
Run Code Online (Sandbox Code Playgroud)
显然我在这里遗漏了一些东西。在什么情况下 lambda 表达式更可取?
您应该了解反射 API 的用途。它专为您设计的其他语言功能无法实现或难以实现的功能而设计。
一个官方文件指出一个(和海事组织最重要的)用例:
调试器需要能够检查类的私有成员。测试工具可以利用反射来系统地调用定义在类上的可发现集 API,以确保测试套件中的高水平代码覆盖率。
因此,在您希望完全访问您测试的代码的测试中,使用反射非常有用。您可以访问private
方法和字段,可以更改final
字段等。文档说明了一个很大的缺点:
由于反射涉及动态解析的类型,因此无法执行某些 Java 虚拟机优化。因此,反射操作的性能比非反射操作慢,应避免在对性能敏感的应用程序中频繁调用的代码段中使用。
灵活性伴随着性能缺陷。您可以在我链接的文档中找到更多用例和缺点。
在您的情况下,在此处使用 lambda 正是 lambda 应该用于的用途(除其他外)。在这里使用反射并不是反射的目的。你可以,但你不应该。
归档时间: |
|
查看次数: |
151 次 |
最近记录: |