Как получить количество возможных целей на месте вызова?

В Java большинство методов являются виртуальными. В месте вызова могут быть вызваны различные фактические методы в зависимости от объектов. Это динамическая рассылка.

Вопрос. Можем ли мы получить количество целей для сайта вызова статически? Например, из байткодов.

К сведению: ответ на "виртуальный метод" содержит простой пример динамическая рассылка.


person JackWM    schedule 11.07.2013    source источник
comment
Количество возможных целей вызова в принципе не ограничено, в зависимости от того, сколько классов доступно, которые реализуют/переопределяют метод.   -  person user207421    schedule 12.07.2013
comment
Из любопытства, почему вы вообще заинтересованы в этом?   -  person DaoWen    schedule 12.07.2013


Ответы (1)


Целями в данном месте вызова будут все классы, являющиеся подтипом типа цели. (Я использую «подтип» здесь как отношение «меньше или равно», например instanceof). Это означает, что вы, по сути, задаете один и тот же вопрос:

Как найти все подклассы данный класс в Java?

Ответ заключается в том, что нет простого способа сделать это. В основном вам просто нужно перечислить все возможные классы и проверить отношения подтипов.

Если вы действительно хотите провести какой-то статический анализ с помощью этого, вы можете создать структуры данных со всеми отношениями иерархии классов, чтобы вы могли выполнять более быстрый поиск по большому набору сайтов вызовов.

person DaoWen    schedule 11.07.2013