Сам изменяющий код в [закрытом] Java

Objective-C

Ниже приведен способ преобразования NSMutableArray в NSArray:

//oldArray is having NSMutableArray data-type.
//Using Init with Array method.
NSArray *newArray1 = [[NSArray alloc]initWithArray:oldArray];

//Make copy of array
NSArray *newArray2 = [oldArray copy];

//Make mutablecopy of array
NSArray *newArray3 = [oldArray mutableCopy];

//Directly stored NSMutableArray to NSArray.
NSArray *newArray4 = oldArray;

Swift

В Swift 3.0 появился новый тип данных Array . Объявите массив, используя ключевое слово let , тогда он станет NSArray . А если объявите, используя ключевое слово var , он станет NSMutableArray .

Пример кода:

let newArray = oldArray as Array
10
задан Reinstate Monica 7 April 2011 в 03:06
поделиться

7 ответов

Не обращая внимания на мир горя, который вы могли причинить себе через самомодифицирующийся код (!), Мне кажется, есть 3 варианта:

  1. использовать встроенную поддержку компилятора Java 6 и писать / перекомпилировать / перезагружать классы
  2. использовать библиотеку манипулирования байт-кодом Apache BCEL для написания вашего класса напрямую
  3. , используя встроенную поддержку сценариев Java 6 (или используйте Apache BSF ) написать методы на выбранном вами языке сценариев JVM и выполнить их

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

9
ответ дан 4 December 2019 в 00:26
поделиться

. Вы можете написать (Java) код, который генерирует новые классы (байтовый код) во время выполнения, используя такую ​​библиотеку, как bcel . Это не совсем то же самое, что самомодифицирующийся код. Я подозреваю, что самомодифицирующийся код не поддерживается JVM .

Для примера генерации нового кода во время выполнения, посмотрите исходный код clojure .

]
2
ответ дан 4 December 2019 в 00:26
поделиться

Из BCEL :

Инженерная библиотека байтового кода предназначена для предоставления пользователям удобная возможность анализировать, создавать и манипулировать (бинарные) файлы классов Java (заканчивающиеся на .class). Классы представлены объектами, которые содержат все символическая информация данного класса: методы, поля и инструкции байтового кода, в частности.

1
ответ дан 4 December 2019 в 00:26
поделиться

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

1
ответ дан 4 December 2019 в 00:26
поделиться

Я вижу эти варианты для этой цели:

  • Сгенерируйте исходный код java и скомпилируйте его с помощью внешнего javac или внутренних инструментов компилятора (не могу вспомнить имя). И поскольку вы отвечаете за присвоение имен, просто включите количество версий в имя класса, чтобы избежать аномалий загрузки класса.
  • Используйте встроенную поддержку движка JavaScript
  • Некоторые сценарии могут быть решены с помощью java Proxys

Править : однажды я создал программу на Java 1.4, которая взяла бизнес-правила из существующей устаревшей базы данных, сгенерировал файлы java (в основном реализации интерфейса Predicate) с помощью набора println () из них и использовал командную строку javac для их компиляции.

1
ответ дан 4 December 2019 в 00:26
поделиться

В качестве старшекурсника я начал работать над JikesRVM . Это JVM, реализованная (в основном) на Java. Во время выполнения он компилируется JIT сам! Это действительно крутая технология.

0
ответ дан 4 December 2019 в 00:26
поделиться

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

-2
ответ дан 4 December 2019 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: