Отключить проверку идентификаторов в Byte Buddy - PullRequest
3 голосов
/ 12 октября 2019

Я работаю над языком программирования на основе JVM и использую Byte Buddy для генератора кода. Язык чем-то похож на Java, но обычно использует аннотации, где Java будет использовать ключевые слова. Некоторые примеры аннотаций: public, private, extends, override, singleton или inject.

В отличие от спецификации Java Language , спецификация Java Virtual Machine накладывает очень мало ограничений на имена классов, и такие имена, как extends или public, являются абсолютно действительнымис точки зрения JVM. Однако, когда я пытаюсь сгенерировать классы аннотаций с именем, которое оказывается ключевым словом Java, я получаю IllegalStateException "Illegal type name" из класса InstrumentedType Байта Бадди.

Как я могу обойти проверкуэто специфично для языка Java и использует более мягкие правила проверки, которые вместо этого следуют Спецификации виртуальной машины Java?

Ответы [ 2 ]

2 голосов
/ 13 октября 2019

Вы можете просто отключить проверку:

new ByteBuddy().with(TypeValidation.DISABLED);
0 голосов
/ 12 октября 2019

Немного изучив источники Byte Buddy, я мог бы найти решение, но это очень нахально, и, надеюсь, кто-то знает лучший способ ...

К счастью для меня, поле KEYWORDS вnet.bytebuddy.dynamic.scaffold.InstrumentedType.Default использует просто обычный изменяемый HashSet вместо Collections.unmodifiableSet, поэтому с помощью следующего хака я смог удалить проверку ключевых слов Java:

val Field KEYWORDS = Default.getDeclaredField("KEYWORDS")
KEYWORDS.setAccessible(true)
val Set<String> keywords = KEYWORDS.get(null) as Set<String>
keywords.clear

(код написан на Xtend синтаксис, но вы поняли идею)

При этом я первый признаю, что использую Java Reflection для поиска в final static полях других библиотекне совсем лучшая практика. Итак, хотя мой непосредственный блокировщик удален, я надеюсь, что есть более ортодоксальное решение этой проблемы ...

...