как рефлексия(с помощью ASM библиотеки) сама по себе код не добавляет, но при этом Java использует для рефлексии добавление кода(OpenJDK). Вопрос в том, возможно ли генерировать исполняемые файлы с полной поддержкой рефлексии, допустим компилятор Java с поддержкой рефлексией?
Ничего не понятно. Что за "рефлексия с помощью ASM библиотеки", что такое "добавление кода" в контексте OpenJDK?
Ну вы классы просто пораждаете с помощью ASM, а рефлексия работает как бы поверх бинарников сама собой автоматически. Если у вас класс-файл кривой то jvm его просто выплюнит с ошибкой
С полной поддержкой рефлексии — нет, если это не JIT-компилятор. Все существующие и существовавшие AOT-компиляторы рефлексию поддерживают только частично. Ну, рефлексию в части генерации нового кода — я так понял, речь об этом.
Рефлексия это же не про генерацию нового кода, а про мета-информацию о типах и коде в целом. Кодогенерация здесь вообще сбоку и никак не связана — как связаны рефлексия и возможность складывать байты в массив? То что эти байты в последствии можно трактовать как класс-файл, загрузить его и исполнить — это скорее про возможность такой загрузки, но никак не про рефлексию. Да блин, даже кнопка которая в jdk загружает класс из байтов находится далеко не в пакете reflection
а это не одно и тоже?
Смотря кого спросить. Рефлексией называют обе возможности — и получение информации о программе в рантайме, и генерацию кода в рантайме. В Dart первое назвали Mirrors, чтобы не было вопросов про второе — мне так думается.
Ну вот спрашиваем джавистов, к ним же вопрос был изначальный
Лучше спросить того, кто спрашивал — что он подразумевал. Судя по упоминанию ASM, он имел в виду кодогенерацию.
И еще раз "генерация кода в рантайме" — это что-то искусственное и за уши притянутое. Как связана рефлексия и то, что мы можем байты сложить в массив?
нужно не байты в массив, а деревья в классы же
Это уже кажется компилятор
Вопрос, очевидно, не в байтах, а их интерпретации в качестве кода. Наверное, "reification" показалось слишком заумным словом, поэтому переиспользовали "reflection". Это не я придумал, так что вопрос терминологии не по адресу.
https://learn.microsoft.com/en-us/dotnet/csharp/advanced-topics/expression-trees/
Это аналог библиотеки asm
Я имел ввиду и то и другое
Ну вот в jdk рефлексия и динамическая загрузка классов вещи если и связанные, то косвенно
Спасибо, я это и имел в виду. В следующий раз буду спрашивать конкретнее, чтобы не было недопониманий
а какой информации не хватает для рефлексии при aot?
было выяснено, что рефлексия это ещё и кодогенерация
Обсуждают сегодня