Получение байт-кода класса на Android
Я хочу отправить по сети файл класса (.class) для выполнения на удаленном сервере. Я не могу использовать сериализацию, потому что класс не существует на стороне сервера, и я хочу динамически добавлять новые классы. Я не хочу использовать RMI.
На Dekstop Java это легко сделать с помощью:
- Загрузка класса с
Class<?> clazz = Class.forName("mypackage.MyClass")
, - Получение доступа к файлу (или jar-контейнеру) с помощью
URL url = clazz.getResource("MyClass.class")
На Android мне удалось загрузить экземпляр класса с этим хаком, ноclazz.getResource()
всегда возвращает ноль. (И это логично, поскольку формат хранения Dalvik другой).
Я пробовал Apache BCEL, но он не работает. Следующий код бросает ClassNotFoundException
:
JavaClass clazz = Repository .lookupClass("mypackage.mMyClass");
byte[] b = clazz.getBytes();
Есть ли способ перевести байт-код Dalvik в байт-код обычного класса на Android, чтобы я мог восстановить из него файл.class и затем отправить его по проводам?
Благодарю.
1 ответ
Android не использует .class
файлы. Оно использует .dex
файлы, это совершенно другой формат. Инструменты, такие как dx
а также dex2jar
можно переводить туда и обратно большую часть времени, но это не идеально, потому что у каждого формата есть свои особенности, которые не совсем соответствуют другому.
Во всяком случае, я думаю, что проще всего было бы скомпилировать его на рабочем столе и собрать все .class
файлы как ресурсы в вашем apk. Фактический код будет выполнен classes.dex
но таким образом вы можете извлечь сохраненные файлы классов и отправить их на ваш сервер.
Кстати, отправка произвольных файлов классов на сервер для выполнения звучит как очень, очень, плохая идея. Пожалуйста, не делайте этого на любом компьютере, который вам небезразличен.