2011-01-11 2 views
3

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

Обнаружен только обходной путь, чтобы создать пустые отсутствующие файлы классов с пустыми методами для компилятора «чит». Работает отлично, но должен быть проще:
Любые идеи?

+0

Я прочитал ваши ответы и должен уточнить свой вопрос. Я изменяю файл jar, который у меня нет источников. Я декомпилирую класс, который хочу, вносить изменения, компилировать в один класс и возвращать в jar и начинать изменяться. Но для компиляции мне нужны другие классы jar. – JIV

+0

Я думаю, что вы уже реализуете единственное разумное решение :) – trojanfoe

ответ

1

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

1

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

ОБНОВЛЕНО согласно информации:

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

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

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

0

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

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

+0

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

+0

@ JIV: Нет, единственное место, где компилятор ищет определения методов, находится в самом классе. Возможно, вы захотите дать нам более подробную информацию, чтобы мы могли понять, что у вас проблемы лучше. Схема кода будет полезна. – sblundy

+0

@ JIV Во время компиляции никакие вещи из других классов не могут быть помещены в скомпилированные классы. Вставка кода может выполняться во время выполнения кода как часть оптимизации кода JVM, но не во время компиляции – Maxym

3

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

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

0

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

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

Смежные вопросы