Стратегии для обратного инжиниринга проекта, который использует Guice? - PullRequest
1 голос
/ 07 июля 2010

Я пытался понять внедрение зависимостей и не совсем понял, за исключением того, что мне удалось понять, что это затрудняет понимание чужого кода. : '(

Во всяком случае, я не уверен, как кратко описать мою проблему, но я попробую. В настоящее время я являюсь единственным программистом, работающим над Java-проектом, над которым работали десятки одиночек около шести лет. Он интенсивно использует библиотеку Google Guice. Я должен взять некоторый существующий код и реализовать его по-другому; в частности, используйте существующие методы для аутентификации по паролю и вместо того, чтобы применять его к каждому JMenuItem в JMenu, примените его ко всему JMenu, чтобы при вводе неправильного пароля или отсутствии пароля все JMenuItem были отключены. Этого не происходит, если пароль неверный, что заставляет меня поверить, что проблема заключается в операторе if, который сам по себе является длинной строкой зависимостей:
if (!ViewScanApp.getApplication().getHistoryManager().isAuthenticated())

Я прослеживаю свой путь назад через это, чтобы обнаружить, что класс HistoryManager является интерфейсом, и там мой путь, кажется, умирает; там нет кода, и он не ссылается ни на какой другой класс. Я нашел конец пути через случайное исследование 100 с лишним классов в проекте, но я не могу связать их. Я не могу найти, где будет вызван первый класс, который я могу найти на другом конце этого стека, AccessManagerImpl.

Я мог бы использовать объяснение внедрения зависимости, которое может быть применимо к этой ситуации. Большое вам спасибо!

Ответы [ 3 ]

3 голосов
/ 07 июля 2010

Если в интерфейсе 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.

1 голос
/ 07 июля 2010

Всякий раз, когда у вас есть определение интерфейса в Eclipse, которое вводится с Guice, вместо того, чтобы использовать F3 для перехода к определению, которое вы сделали бы, если бы это был класс, используйте Ctrl-T, чтобы выбрать одну из реализаций этого интерфейса.

Если у вас есть несколько вариантов выбора, вам нужно распечатать привязки модулей, чтобы вы знали, какой из них выбрать.К сожалению, Eclipse еще не понимает инъекцию.

1 голос
/ 07 июля 2010

Запустите отладчик.Он проведет вас через точный класс, реализующий этот интерфейс (при условии, что у вас есть исходный код)

...