zen*_*ngr 15 theory oop reflection
我只是好奇,我们为什么要首先使用反射?
// Without reflection
Foo foo = new Foo();
foo.hello();
// With reflection
Class cls = Class.forName("Foo");
Object foo = cls.newInstance();
Method method = cls.getMethod("hello", null);
method.invoke(foo, null);
Run Code Online (Sandbox Code Playgroud)
我们可以简单地创建一个对象并调用类的方法,但为什么使用forName,newInstance和getMthod函数呢?
让一切变得动态?
Jon*_*eet 33
简单地说:因为有时你在编译时不知道"Foo"或"hello"部分.
绝大多数时候你都知道这一点,所以不值得使用反射.然而,偶尔,你不会 - 而且在那时,你可以转向反思.
例如,协议缓冲区允许您生成代码,其中包含用于读取和写入消息的完整静态类型代码,或者生成的代码足以使其余部分可以通过反射完成:在反射情况下,加载/保存代码必须通过反射获取和设置属性 - 它知道由于消息描述符而涉及的属性的名称.这很慢(很多)但生成的代码要少得多.
另一个例子是依赖注入,其中用于依赖的类型的名称通常在配置文件中提供:DI框架然后必须使用反射来构造所涉及的所有组件,沿途找到构造函数和/或属性.
每当你(=你的方法/你的类)在编译时不知道类型应该实例化或它应该调用的方法时,它就被使用.
此外,许多框架使用反射来分析和使用您的对象.例如:
String,您可以获取目标类,获取具有已配置名称的方法,并在编译时不知道它的情况下调用它.| 归档时间: |
|
| 查看次数: |
6905 次 |
| 最近记录: |