在Java/C#等中使用反射有什么用

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框架然后必须使用反射来构造所涉及的所有组件,沿途找到构造函数和/或属性.


Boz*_*zho 6

每当你(=你的方法/你的类)在编译时不知道类型应该实例化或它应该调用的方法时,它就被使用.

此外,许多框架使用反射来分析和使用您的对象.例如:

  • hibernate/nhibernate(和任何对象关系映射器)使用反射来检查类的所有属性,以便它能够更新它们或在执行数据库操作时使用它们
  • 您可能希望使其可配置应用程序默认执行用户定义类的哪个方法.配置的值是String,您可以获取目标类,获取具有已配置名称的方法,并在编译时不知道它的情况下调用它.
  • 解析注释是通过反射完成的