Найти реализацию метода интерфейса - PullRequest
0 голосов
/ 27 сентября 2019

Я хотел бы визуализировать цепочки методов нашей кодовой базы (какой метод вызывает какой метод), начиная с данного метода с помощью jqassistant.

Для обычных вызовов методов работает следующий запрос Cypher.workupNotification - это метод, с которого я начинаю:

MATCH (begin:Method {name: "workupNotification"}) -[INVOKES*1..20]-> (method:Method) WHERE not method:Constructor and exists(method.name) RETURN begin, method, type

Но многие вызовы методов в нашем программном обеспечении - это вызовы интерфейсов, реализация которых в методе неизвестна (SOA с инверсией зависимости).

serviceRegistry.getService(MyServiceInterface.class).serviceMethod();

Как выбрать реализацию этого метода (Есть два класса, реализующих каждый интерфейс. Один генерируется автоматически (Proxy), другой интересует меня.)

1 Ответ

1 голос
/ 28 сентября 2019

Вам нужно сделать то, что JVM выполняет для вас во время выполнения: разрешение вызовов виртуальных методов.Существует предопределенная концепция jQAssistant, которая распространяет отношения INVOKES на реализацию подклассов: java:InvokesOverriddenMethod.Вы можете ссылаться на него как на обязательное понятие из одного из ваших собственных правил или применять его из командной строки, например, с помощью Maven:

mvn jqassistant:analyze -Djqassistant.concepts=java:InvokesOverriddenMethod

Правило задокументировано в руководстве, см. http://buschmais.github.io/jqassistant/doc/1.6.0/#java:InvokesOverriddenMethod

(Название концепции не интуитивно понятно, лучше заменить его на что-то вроде java:VirtualInvokes).

...