Динамическое редактирование / создание классов в Java Android - PullRequest
2 голосов
/ 17 сентября 2011

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

Я могу подобным образом привести в Javascript и PHP.Я знаю, что это может быть сделано в Java, используя что-то вроде ASM, BCEL или CGlib.Тем не менее, я не знаю достаточно о любой из них, чтобы понять, будут ли они работать на Android.Или, как они будут работать, каковы последствия?

Если, гипотетически, все три будут работать в Android, кто-то может указать мне в правильном направлении, где начать понимать, что использовать, и какиспользовать это?

Я не много занимался программированием на Java, и я только недавно работал с ним на Android, поэтому я ценю всю помощь / исправление, которые я могу получить.С учетом сказанного, я был бы признателен, если бы ваш ответ НЕ был просто: не делайте этого.Я ищу, как сделать это конкретно, а не как сделать это правильно.По крайней мере, пока мое приложение не рухнет.:)

Я считаю, что это уже происходит в Android в следующих ситуациях: (не на 100% УВЕРЕН)

Создание объекта из JSON.AIDL

Ответы [ 3 ]

3 голосов
/ 17 февраля 2012

Для тех, кто действительно делает хочет сделать это (например, используя JIT Дальвика для создания быстрого переводчика для другого языка), есть этот проект:

http://code.google.com/p/dexmaker/

, который позволяет программно создавать классы, переменные и методы.

3 голосов
/ 17 сентября 2011

Не делай этого:)

Я на самом деле сомневаюсь, что есть библиотеки JSON, которые ведут себя таким образом; Я знаю, что есть два общепринятых способа (я не эксперт в этом вопросе): либо создать какую-то структуру данных, содержащую пары имя-значение - то есть добавить материал в структуру данных, но не создавать новый класс - либо подготовить шаблон класса, который будет заполнен из объекта JSON.

Java, будучи статически типизированной, на самом деле не подходит для создания совершенно новых классов во время выполнения, и для этого нет поддержки отражений - хотя есть поддержка доступа к объектам неизвестных типов (например, запросы для всех их полей). / методы).

Что вы можете сделать, это вручную записать класс Java в файл - либо в коде Java, а затем скомпилировать его каким-либо образом или непосредственно в байт-коде - и затем загрузить этот файл во время выполнения. Это некрасиво, но это сработает. Тогда это точно так же, как любая загрузка классов во время выполнения - либо вы полагаетесь на базовый класс / интерфейс загруженного класса, либо вы должны использовать отражение, чтобы сделать что-то значимое с ним.

1 голос
/ 01 марта 2012

Генерация байт-кода 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 reference

https://github.com/headius/dexclient/blob/master/src/DexClient.java

...