2016-04-25 82 views
0

我正在学习有关Dagger 2 - 依赖注入库的Android - 在许多文章中,当作者日期比较匕首2与它的旧版本(匕首),他这样说:什么是具体调用,它与Reflection有什么不同?

(...)

的新版本,如许,解决了许多原来的问题:

  • 没有更多的思考 - 一切都为具体的调用来完成(ProGuard的工作,没有配置在所有)

(...)

来源:https://blog.gouline.net/dagger-2-even-sharper-less-square-b52101863542#.w33tjdttt

我知道Reflection can be used for observing and modifying program execution at runtime,但对于这些混凝土呼叫?它们是什么以及它们与反射有什么不同?

Obs .:如果有人可以提供一些关于如何创建/使用这些具体调用的示例代码/用例,那将会很棒。

+2

“具体调用”指的是用'foo.bar()'调用一个像你一样的方法。他们没有什么特别之处,他们的整个观点是他们不是特别的;他们只是如何正常编写代码。 –

回答

1

呃...匕首使用了一些反射和匕首2 ...没有。

Dagger 2使用注释处理到生成代码编译时间。所有那些你放在你的类上的注释,@Component,@Module等等,都会向匕首2编译器发出信号。

它将使用它们来创建依赖关系图,验证它,然后创建代码。有这种做法一些好处,比匕首:

  • 编译时间验证(如果您有依赖循环,或不能提供的东西,它不会编译和你编译时得到一个错误,而不是运行程序)
  • 性能(everyting只是简单的java —不涉及任何反射)
  • Proguard的“支持”(通过不依靠反射,会出现使用ProGuard没有问题)
时异常

因此,正如在评论中已经提到的,具体调用在这种情况下将意味着消除反射和生成代码。 Dagger 2将生成大量源文件,您可以使用该文件轻松调试代码。

1

混凝土电话,在那里你直接调用该方法,并编译器创建一个调用指令:

System.currentTimeMillis(); 

这是调用方法最快的方法,但如果你知道在编译期它只时间你需要调用哪种方法(这是99%的情况)。这是你如何正常编写代码。

有时候,你不知道你需要调用什么方法。也许用户或文件告诉你需要调用哪种方法。为此,您需要使用反射。这是慢得多,但允许你动态指示调用哪个方法:

Scanner in = new Scanner(System.in); 
String method = in.next(); 
// Reflection invocation: 
Object result = System.class.getMethod(method).invoke(); 
System.out.println("Result was: " + result); 

这将让你currentTimeMillis键入到命令行,并返回值。你也可以输入nanoTime,它也会打印结果。

因为反射是额外的间接层(没有在上面的反射代码没有System.currentTimeMillis()电话 - 但它可能称之为!),它通过扫描编译后的代码进行操作的工具和重写方法调用将失败正确处理反射电话。

相关问题