【问题标题】:Strategies for reverse engineering project that uses Guice?使用 Guice 的逆向工程项目策略?
【发布时间】:2011-03-12 23:46:15
【问题描述】:

我试图理解依赖注入但并没有完全理解它,除了我设法理解它使理解别人的代码变得困难。 :'(

无论如何,我不确定如何简要描述我的问题,但我会尝试。我目前是一个 Java 项目的唯一编码员,该项目由数十名孤独的人在大约六年的时间里工作。它大量使用了 Google 的 Guice 库。我应该采用一些现有的代码并以不同的方式实现它;具体来说,使用现有的方法进行密码验证,而不是将其应用于JMenu中的每个JMenuItem,而是将其应用于整个JMenu,这样如果输入错误密码或未输入密码,则禁用所有JMenuItem。如果密码错误就不会发生这种情况,这让我相信问题出在 if 语句中,它本身就是一长串依赖项:
if (!ViewScanApp.getApplication().getHistoryManager().isAuthenticated())

我通过这个回溯,发现HistoryManager 类是一个接口,我的路径似乎死了;那里没有代码,也没有引用任何其他类。我通过随机探索项目中的 100 多个类找到了路径的尽头,但我似乎无法将它们连接起来。我找不到在此堆栈的另一端可以找到的第一个类 AccessManagerImpl 被调用的位置。

我可以使用可能适用于这种情况的依赖注入的解释。非常感谢!

【问题讨论】:

  • “依赖注入”就像“新”一样,只是它是通过魔法发生的,而不是您必须输入“新”...

标签: java netbeans dependency-injection reverse-engineering guice


【解决方案1】:

假设HistoryManager 接口上没有@ImplementedBy 注释,您需要检查负责绑定此类型的Guice Module

在 Eclipse 中,有一个命令可以查找某个类的出现。我敢打赌 Netbeans 也有类似的东西。使用它来查找HistoryManager 的出现。其中至少一个应该出现在实现com.google.inject.Module(或扩展AbstractModule)的类中。您可能会看到类似

protected void configure() {
  …
  bind(HistoryManager.class).to(HistoryManagerImpl.class);
  …
}

或者,如果你喜欢简单粗暴的经验主义,你可以投个println()

HistoryManager mgr = ViewScanApp.getApplication().getHistoryManager();
System.out.println("HistoryManager implementation: " + mgr.getClass());
if (!mgr.isAuthenticated())
   …

无论您如何找到它,HistoryManagerImpl 课程都是您想要找到线索的地方。

我没用过,但Guice graphing tool 也可能有用。

【讨论】:

  • 这个问题被一个deus ex machina解决了:原来的程序员。你给我的测试语句产生了 $proxy7,我不明白。然后他将我指向正确的类的方向,这决定了我在其他地方看不到的绑定。
【解决方案2】:

启动调试器。它将引导您完成实现该接口的确切类(假设您拥有它的源代码)

【讨论】:

    【解决方案3】:

    每当您在 Eclipse 中有一个使用 Guice 注入的接口定义时,而不是使用 F3 转到如果它是一个类时您会执行的定义,然后使用 Ctrl-T 在该接口的实现中进行选择。

    如果您有多个可供选择,那么您需要打印出模块绑定,以便您知道选择哪一个。不幸的是,Eclipse 还不了解注入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-29
      • 2014-07-03
      • 2013-01-19
      • 2018-10-30
      • 2012-09-25
      • 1970-01-01
      • 2011-12-15
      • 2011-08-13
      相关资源
      最近更新 更多