Динамическое редактирование / создание классов в Java Android
Я ищу способ динамически определять классы и создавать их экземпляры в Android во время выполнения. Насколько я понимаю, это уже сделано в Android, мне просто нужна помощь, чтобы понять это.
Я могу подобным образом привести в Javascript и PHP. Я знаю, что это может быть сделано в Java, используя что-то вроде ASM, BCEL или CGlib. Тем не менее, я не знаю достаточно о любом из них, чтобы понять, будут ли они работать на Android. Или, из них будут работать, каковы последствия?
Если, гипотетически, все три будут работать в Android, кто-то может указать мне правильное направление относительно того, где начать понимать, что использовать и как его использовать?
Я не много занимался программированием на Java, и только недавно работал с ним на Android, поэтому я ценю всю помощь / исправление, которые я могу получить. С учетом сказанного, я был бы признателен, если бы ваш ответ НЕ был простым: не делайте этого. Я ищу, как это сделать конкретно, а не как это сделать правильно. По крайней мере, пока мое приложение не рухнет.:)
Я считаю, что это уже происходит в Android в следующих ситуациях: (не уверен на 100%)
Создание объекта из JSON. AIDL
3 ответа
Не делай этого:)
Я действительно сомневаюсь, что есть библиотеки JSON, которые ведут себя таким образом; Я знаю, что есть два общепринятых способа (я не эксперт в этом вопросе): либо создать какую-то структуру данных, содержащую пары имя-значение, то есть добавить материал в структуру данных, но не создавать новый класс, либо подготовить шаблон. класса, который будет заполнен из объекта JSON.
Java, будучи статически типизированной, на самом деле не подходит для создания совершенно новых классов во время выполнения, и для этого нет поддержки отражения - хотя есть поддержка доступа к объектам неизвестных типов (например, запросы для всех их полей / методов),
Что вы можете сделать, это вручную написать класс Java в файл - либо в коде Java, а затем скомпилировать его каким-либо образом или непосредственно в байт-коде - и затем загрузить этот файл во время выполнения. Это некрасиво, но это сработает. Тогда это точно так же, как любая загрузка классов во время выполнения - либо вы полагаетесь на базовый класс / интерфейс загруженного класса, либо вы должны использовать отражение, чтобы сделать что-то значимое с ним.
Для тех, кто действительно хочет сделать это (например, используя JIT от Dalvik для создания быстрого переводчика для другого языка), есть этот проект:
http://code.google.com/p/dexmaker/
Что позволяет программно создавать классы, переменные и методы.
Генерация байт-кода Dalvik во время выполнения на устройстве с использованием ASM или BCEL
В этом примере используются ASM и BCEL для генерации двух классов на устройстве. Классы создаются в памяти SD-карты, а затем динамически загружаются в операционную систему Android.
Следующий класс является шаблоном примера:
public class HelloWorld {
public static void hello(){
int a=0xabcd;
int b=0xaaaa;
int c=a-b;
String s=Integer.toHexString(c);
System.out.println(s);
}
}
Во-первых, я использовал BCEL или ASM для создания нового специального класса в SD-карте. Во-вторых, я преобразовал класс Java в класс Dex с помощью утилиты Dxclient на SD-карте. Наконец, я создал файл JAR, а затем я загрузил этот пакет в устройство с SD-карты
DXClient ссылка
https://github.com/headius/dexclient/blob/master/src/DexClient.java