Java размышляет о переменных области видимости метода - PullRequest
2 голосов
/ 03 февраля 2011

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

По сути, я хотел бы выяснить все зависимости от других классов, которые есть у данного класса.

Пример: учитывая следующий код:

import com.yada.yada.yada.SomeClass 

public class MyClass
{
  public MyClass
  {
    new SomeClass();
  }
}

Как я могу узнать, что MyClass использует SomeClass в своем конструкторе?

Я пытался придумать, как получить все операторы импорта, определенные в файле класса, но я также не смог найти ничего подобного.Но, предполагая, что есть способ как-то выкопать все операторы импорта, определенные в файле классов, как можно узнать о классах, определенных в том же пакете, которые не требуют оператора импорта?

РЕДАКТИРОВАНИЕ:

Сценарий: цель состоит в том, чтобы отправить байт-код этого класса (MyClass) другому процессу.Затем этот другой процесс принимает байт-код и загружает класс (MyClass) с помощью загрузчиков классов и так далее.Проблема в том, что когда я пытаюсь создать и запустить экземпляр MyClass в другом процессе, он завершается неудачно, потому что не может найти определение SomeClass.

Если бы SomeClass был членом MyClass, это не было бы проблемой, но, поскольку единственная ссылка на него была в методе, нет способа добраться до него через отражение?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

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

Но это невозможно сделать для всех случаев (просто представьте метод, который использует Class.forName() для запроса случайного имени класса при каждом его вызове).

как узнать о классах, определенных в одном пакете

На самом деле это вообще невозможно, поскольку концепция загрузчика классов действительно позволяет запрашивать только полное имя класса и получать либо этот класс, либо ClassNotFoundException. Классы могут быть загружены с веб-сервера (в случае апплетов) или сгенерированы на лету, поэтому вы не можете узнать, существует ли определенный класс, кроме как запросив его.

2 голосов
/ 03 февраля 2011

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

Чего ты пытаешься достичь? Возможно, если вы расскажете нам о вашей реальной проблеме, а не о предполагаемом решении, мы сможем вам помочь.

1 голос
/ 03 февраля 2011

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

Создать ClassVisitor, который собирает зависимости от

  • Объявления классов
  • Аннотации
  • Объявления локальных переменных
  • Объявления полей
  • Объявления методов
  • Вызовы методов
  • (я что-нибудь забыл?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...