Создание интерфейса аннотации с ByteBuddy - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь использовать ByteBuddy для создания простого интерфейса аннотации с атрибутом String value(). Я использую следующий код (синтаксис Xtend, но вы поняли идею):

new ByteBuddy()
  .makeInterface(Annotation)
  .merge(Visibility.PUBLIC)
  .name("fxxx.lang.Annotation")
  .defineMethod("value", TypeDescription.STRING)
  .withoutCode
  .make.load(class.classLoader).loaded

Без метода value() (то есть, если я удалю defineMethod и withoutCode), это работает красиво. Однако, как только я добавляю атрибут / метод к аннотации, я получаю это исключение:

java.lang.ClassFormatError: Method value in class fxxx/lang/Annotation has illegal modifiers: 0x400
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.access$300(ByteArrayClassLoader.java:40)
    at net.bytebuddy.dynamic.loading.ByteArrayClassLoader$ClassDefinitionAction.run(ByteArrayClassLoader.java:614)
    at net.bytebuddy.dynamic.loading.ByteArrayClassLoader$ClassDefinitionAction.run(ByteArrayClassLoader.java:566)
    at java.security.AccessController.doPrivileged(Native Method)
    at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.findClass(ByteArrayClassLoader.java:339)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at net.bytebuddy.dynamic.loading.ByteArrayClassLoader.load(ByteArrayClassLoader.java:289)
    at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$WrappingDispatcher.load(ClassLoadingStrategy.java:342)
    at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default.load(ClassLoadingStrategy.java:128)
    at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:85)
    at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:5468)
    at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:5457)

Я чрезвычайно озадачен этим исключением, потому что 0x400 - это ACC_ABSTRACT, что именно то, что вы ожидайте от метода интерфейса.

Есть идеи, что мне здесь не хватает?

1 Ответ

0 голосов
/ 28 февраля 2020

Конечно, как только я заканчиваю sh, пишу свой вопрос, я помню, что методы интерфейса не только должны быть абстрактными, они также должны быть опубликованы c. Значение модификатора 0x400 указывает, что метод является только абстрактным, но не публикуемым c.

Итак, простым исправлением было добавление публичной c видимости к атрибутам метода:

.defineMethod("value", TypeDescription.STRING, Visibility.PUBLIC)
...