Я пытаюсь использовать 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
, что именно то, что вы ожидайте от метода интерфейса.
Есть идеи, что мне здесь не хватает?