Компилировать класс Java с отсутствующими частями кода - PullRequest
3 голосов
/ 11 января 2011

Я ищу некоторые идеи о том, как скомпилировать код Java без некоторых других фрагментов кода (вызовы методов). Я полностью осознаю, что javac не позволит вам скомпилировать файлы Java, если не сможет найти все зависимости. Но, возможно, есть какой-то способ обойти это, что-то вроде принудительной компиляции.
Мои знания байт-кода не так хороши, но я думаю, что вызов некоторого метода - это просто полное определение пакета класса и имени метода с параметрами. Так что, если компилятор просто помещает эти данные в файл класса и предполагает, что в процессе работы будет доступна зависимость (если не просто NoSuchMethodExp).

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

Ответы [ 5 ]

3 голосов
/ 11 января 2011

Использовать интерфейсы.

Создайте интерфейсы с нужными вам методами. Во время выполнения вставьте (Spring, Guice и т. Д.) Или сгенерируйте (cglib ...) классы, которые реализуют интерфейс.

1 голос
/ 11 января 2011

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

1 голос
/ 11 января 2011

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

ОБНОВЛЕНО согласно предоставленной информации:

Что ж, есть еще одна возможность изменить классы в jar, вы можете использовать AOP, и чтобы сделать это, прочитайте о AspectJ - на самом деле для меня это самый простой вариант (обычно вам нужно потратить время дразнить объекты, писать пустые методы, поэтому я бы потратил на это время на изучение новых технологий, которые вам помогут много раз;)
И, кстати, самый простой способ реализовать это, если вы используете Eclipse, это:

  1. установка AJDT
  2. создать проект аспекта
  3. создать аспект, который изменяет код (в зависимости от того, что вам нужно изменить)
  4. добавить файл jar, который вы хотите изменить
  5. немедленно получить модифицированный код в другой уже упакованный файл jar

Звучит волшебно:)
В этом случае вам не нужны никакие зависимости в classpath, за исключением библиотек, которые необходимы для нового кода, который вы добавляете!

0 голосов
/ 11 января 2011

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

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

0 голосов
/ 11 января 2011

Методы не являются зависимостями.Они являются частью определения класса.Единственные места, где среда выполнения Java ищет определения методов, находятся в классе def, который был скомпилирован во время компиляции, и в его родительских классах.Если ваша проблема в том, что суперкласс неполный, я не думаю, что смогу вам помочь.

Если нет, вы можете определить некоторые из этих методов как абстрактные, а затем реализовать их в дочернем классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...