2016-09-11 6 views
1

Этот вопрос был задан без удовлетворительного ответа, кроме «зачем вы хотите это сделать», по адресу Reserved words as variable or method names. Я снова попрошу об этом и предоставит контекст, объясняющий, почему это необходимо, и даже направление к правильному решению.Создайте динамические классы с зарезервированными словами как переменные

Я пишу код, который динамически строит классы в соответствии с схемой базы данных, с которой я не контролирую. По большей части код работает чисто, но примерно в 0,1% случаев столбца в Java используются зарезервированные слова, используемые в качестве имен столбцов. Следующий код используется для создания динамического поля в классе:

evalClass.addField (CtField.make ("public" + columnType + "" + columnName + ";", evalClass));

Теперь, когда Java является языком, это приводит к возникновению проблемы, однако в байт-коде JVM это должно быть совершенно законным, поэтому должен быть способ динамически создавать это поле и обращаться к нему с помощью операций с байтовым кодом. Есть ли у кого-нибудь примеры того, как это будет сделано таким образом, чтобы поддерживать произвольные строки, включая пробелы и зарезервированные слова? Благодаря!

+0

Этот вопрос абсолютно удовлетворительный: [* «Нет, нет способа». * (Http://stackoverflow.com/a/424002/157247). Различие между вашим вопросом и тем, что вы «Не пытайтесь сделать это на уровне исходного кода *. Я предлагаю редактировать, чтобы перенести эту информацию на передний план, и упомянуть только о другом вопросе в конце, говоря: «Я видел это, но он спрашивает об исходном коде, и я прошу сделать это на уровне байт-кода, поскольку мы не можем сделайте это на уровне исходного кода ». –

+4

Я все еще не понимаю, зачем это нужно. Каждая архитектура сохранения, о которой я могу думать, предоставляет простые методы для сопоставления имен свойств поля/bean для произвольных имен столбцов и исключения имен полей ключевых слов Java, является одной из причин этого. Конечно, вы генерируете классы из схемы, но концепция такая же. Почему имена полей должны совпадать с именами столбцов? Почему бы вам просто не сделать это? добавить префикс ко всем вашим именам полей (или только зарезервированным словам) или что-то вместо этого? –

+3

Даже если вы могли бы сгенерировать классы, какую цель они будут выполнять? Вы не можете использовать эти поля в любом исходном коде, который вы написали. Все это звучит как действительно хороший способ потратить много времени.Потратьте это время на построение сопоставлений, которые Джейсон упомянул в вашей архитектуре персистентности (и/или, возможно, спросите себя, почему вы пишете свою собственную архитектуру персистентности). –

ответ

2

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

Например, используя ASM, вы просто передаете строку непосредственно для посещенияField. Нет никаких обручей, чтобы прыгать или что-то еще.

Обратите внимание, что даже на уровне байт-кода все еще есть несколько ограничений на имена полей. В частности, они не могут содержать более 65535 байтов в кодировке MUTF8.

1

Вы выбрали единственный способ, которым это не работает - API-интерфейс уровня Javassist. Для вас должно быть очевидно, что если вы используете идентификатор для построения исходного кода, идентификатор должен придерживаться правил исходного кода. Кроме того, использование уже известной предполагаемой структуры для создания исходного кода, которое необходимо проанализировать снова для воссоздания намерения, является самым неэффективным способом обработки байтового кода.

Вы можете использовать Bytecode level API для преодоления этих ограничений. В качестве основной заметки большинство других библиотек обработки байтовых кодов вообще не имеют API-интерфейса на уровне исходного кода, поэтому с ними вы с самого начала использовали бы API уровня байтового кода.

Тем не менее, вы должны пересмотреть свое предположение. Сгенерированные классы, поля которых могут быть доступны только через Reflection или другой сгенерированный код, не предлагают никаких преимуществ, например. a HashMap сопоставление от идентификаторов к значениям или массивам, связанным по сути с столбцами с позициями.

+0

Спасибо за подтверждение, казалось, Javassist был простым способом получить необходимую функциональность, и для 99,9% случаев он работает. Поскольку этот конкретный элемент функциональности нужно использовать только для настройки классов, производительность не является основным фактором. Исходя из этого, этот код является кодом уровня драйвера на уровне JDBC, и мы не контролируем поля, а также используем другой код от партнера, который опирается на поля, соответствующие тем, что находится в базе данных. Таким образом, изменение названий полей было бы более болезненным, чем просто выполнение этой работы. –

+0

Ну, API уровня исходного кода не только дороже с точки зрения производительности, но и открывает больше возможностей для внедрения ошибок. Он не только чувствителен к именам полей, которые соответствуют ключевым словам, но также добавление полей с именами, соответствующими именам типов, может сделать ложные объявления * next * ложными. – Holger

 Смежные вопросы

  • Нет связанных вопросов^_^