使用Guice的逆向工程项目策略?

时间:2010-07-07 18:52:43

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

假设@ImplementedBy界面上没有HistoryManager注释,您需要检查负责绑定此类型的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也可能有用。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

每当你在Eclipse中有一个注入了Guice的接口定义,而不是使用F3来进行定义,如果它是一个类,你将使用Ctrl-T来选择该接口的实现。

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