| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Как обмануть JVM |
| Автор: lazycat 28.10.2010, 03:57 |
| Доброго времени суток всем! Есть приложение. Исходный код недоступен. В какой-то момент времени в нем создается экземпляр класса A. Надо вместо A подсунуть ему класс B. В классе A и B одинаковый набор переменных и методов, но коды методов различаются. Простейшее решение, заменить A.class другим файлом не проходит, так как A - из библиотеки rt.jar (увы!). Сделать загрузчик классов, который бы формировал не тот код не получается - метод defineClass - final. Обращаюсь к гуру, как вы думаете, есть ли способ решить проблему, не уродуя JVM? Кстати, по поводу последнего вопроса. Кто знает, где лежит исходный код JRE? Все ссылки на сервер Sun уже нерабочие (похоже Oracle ведет свою политику). Заранее благодарен всем откликнувшимся. |
| Автор: dobrolub 28.10.2010, 04:44 |
| посмотри на следующие вещи: javas -Xbootclasspath/p: myjar.jar ставит твой jarик вперёд всех, но там могут быть ограничения на package name. Если такие есть, посмотри как их можно обойти. Глянь в исходники java. посмотри на java.lang.instrument package . Он предназначен для переопределения классов. Но я не уверен, что можно переопределить класс из java.* А что за задачка то? Может можно по другому подойти? |
| Автор: COVD 28.10.2010, 05:22 | ||
Видимо, "вскрыть сейф". |
| Автор: Skipy 28.10.2010, 10:22 | ||
Неделю назад скачивал исходники 6u23. Сейчас проверил: прямо на странице скачивания - http://www.oracle.com/technetwork/java/javase/downloads/index.html - есть раздел Java SE 6 JDK Source Code. Нажимаете кнопку, попадаете сюда: http://download.java.net/jdk6/source/. Пожалуйста, полные исходники по лицензии JRL. 7-я версия тут же: http://download.java.net/jdk7/ |
| Автор: Kircul 28.10.2010, 11:37 |
| Насколько я понял это все продолжение http://forum.vingrad.ru/forum/topic-313586.html. Прикладываю пример решения задачи с помощью замены загрузчика классов (прошу строго не судить за код, это только набросок). В моем случае байт-код класса изменяется перед загрузкой "на лету", пытаясь продебажить код не понятно в чем проблемма ;). В общем так или иначе желательно запускать с параметром -verbose и разобраться какие классы каким загрузчиком загрузились. Это поможет определиться подойдет ли данный метод в вашем случае. |
| Автор: lazycat 28.10.2010, 18:58 |
| Спасибо всем, кто откликнулся, но неожиданно проблема разрешилась сама собой (владелец программы дал исходные коды и извращаться уже не надо). Поскольку техническая проблема не решена, то вопрос как решенный не помечаю. Не знаю, стоит ли продолжать дискуссию, вопрос, хотя по-моему, и интересный, но уж слишком экзотический, вряд ли подобная проблема возникнет повторно. Еще раз спасибо всем! |