ByteBuddy: java.lang.IllegalArgumentException: невозможно прикрепить неопределенную переменную: V

При перебазировании класса com.google.common.collect.ImmutableMultimap$Values из Google Guava я получаю исключение IllegalArgumentException от ByteBuddy.

Внутренний класс является подклассом com.google.common.collect.ImmutableCollection, чей метод ImmutableList<E> createAsList() вызывает проблему.

Трассировки стека:

Exception in thread "main" java.lang.IllegalArgumentException: Cannot attach undefined variable: V
at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$Substitutor$ForAttachment.onTypeVariable(TypeDescription.java:1973)
at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$Substitutor$ForAttachment.onTypeVariable(TypeDescription.java:1896)
at net.bytebuddy.description.type.TypeDescription$Generic$OfTypeVariable$Symbolic.accept(TypeDescription.java:5551)
at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$Substitutor.onParameterizedType(TypeDescription.java:1857)
at net.bytebuddy.description.type.TypeDescription$Generic$Visitor$Substitutor$ForAttachment.onParameterizedType(TypeDescription.java:1896)
at net.bytebuddy.description.type.TypeDescription$Generic$OfParameterizedType.accept(TypeDescription.java:5017)
at net.bytebuddy.dynamic.Transformer$ForMethod$TransformedMethod.getReturnType(Transformer.java:377)
at net.bytebuddy.description.method.MethodDescription$AbstractBase.asTypeToken(MethodDescription.java:685)
at net.bytebuddy.dynamic.scaffold.MethodRegistry$Default$Prepared$Entry.resolveBridgeTypes(MethodRegistry.java:916)
at net.bytebuddy.dynamic.scaffold.MethodRegistry$Default$Prepared.compile(MethodRegistry.java:778)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining$RedefinitionClassVisitor.visit(TypeWriter.java:3281)
at net.bytebuddy.jar.asm.ClassReader.accept(Unknown Source)
at net.bytebuddy.jar.asm.ClassReader.accept(Unknown Source)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining.create(TypeWriter.java:3018)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1617)
at net.bytebuddy.dynamic.scaffold.inline.RebaseDynamicTypeBuilder.make(RebaseDynamicTypeBuilder.java:198)
at net.bytebuddy.dynamic.scaffold.inline.AbstractInliningDynamicTypeBuilder.make(AbstractInliningDynamicTypeBuilder.java:90)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:2566)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$Delegator.make(DynamicType.java:2668)
at cl.InnerClassLoader.loadClass(InnerClassLoader.java:187)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at test.Stuff.<init>(Stuff.java:15)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at java.lang.Class.newInstance(Class.java:438)
at test.Main.main(Main.java:15)

Я создал пример, вызывающий проблему, здесь: https://github.com/erikhakansson/bytebuddytest test был изменен по сравнению с предыдущим тестом, который у меня был, поэтому там может быть какой-то мусор.

Для проверки просто запустите mvn clean install, а затем запустите полученный файл jar.

Скорее всего, я что-то делаю не так, но не могу понять что, так что помогите! :)


person erikh    schedule 27.07.2016    source источник


Ответы (1)


Вы нашли ошибку в Byte Buddy. Я решил эту проблему (ранее неверную в версии 1.6.14) в Byte Buddy 1.4.17.

person Rafael Winterhalter    schedule 27.07.2016
comment
Ах я вижу. Что-нибудь, что я могу сделать в то же время, чтобы обойти проблему? - person erikh; 28.07.2016
comment
Новая версия была выпущена вчера вечером, поэтому я бы порекомендовал просто обновиться. - person Rafael Winterhalter; 28.07.2016
comment
К сожалению, я получаю ту же ошибку с новой версией. Может ли быть другая проблема? Я обновил связанное репо, чтобы использовать новую версию. - person erikh; 28.07.2016
comment
Вы уверены, что правильно обновились? Я скачал ваш проект и протестировал его. - person Rafael Winterhalter; 29.07.2016
comment
Я только что дважды проверил. Ваш метод main возвращает без ошибок при новой проверке вашего проекта. - person Rafael Winterhalter; 29.07.2016
comment
Ха, это странно. Я должен буду проверить снова. Я сделаю это сегодня вечером, когда снова буду за компьютером - person erikh; 29.07.2016
comment
Я все еще получаю сообщение об ошибке, но теперь я понял, что это для другого класса: com.google.common.collect.ImmutableMultimap$EntryCollection Я использую jdk1.8.0_31, если это имеет значение. - person erikh; 31.07.2016
comment
Я обновил тест, чтобы распечатать имя класса, который он пытается загрузить, но я полагаю, что это не имеет значения, если вы не можете его воспроизвести. :/ Я собираюсь попробовать другую среду, чтобы увидеть, не является ли это чем-то специфичным для среды. - person erikh; 31.07.2016
comment
Привет, я убедился, что от проекта не осталось следов, и теперь я могу воспроизвести ошибку; Буду разбираться, может что-то пропустил. - person Rafael Winterhalter; 31.07.2016
comment
Ах, приятно знать. Тогда я не сойду с ума! :) Спасибо за помощь! - person erikh; 01.08.2016
comment
Нет. Простите за это. Я уже определил основную проблему и сделал неправильное предположение, так что мое исправление только ухудшило ситуацию. Мне нужно кое-что учесть, прежде чем я смогу решить эту проблему, но я занимаюсь этим. Я включу исправление в 1.4.17. - person Rafael Winterhalter; 01.08.2016
comment
Релиз вышел на Maven Central. - person Rafael Winterhalter; 01.08.2016
comment
В последней версии проблема решена! Благодарю вас! (Не связано: есть ли страница пожертвований для bytebuddy?) - person erikh; 02.08.2016
comment
@erikh Нет, но в этом нет необходимости. Я консультант, и то, как Byte Buddy работает для меня, заключается в том, что я надеюсь, что это принесет какой-то бизнес. Я ценю гость, однако. - person Rafael Winterhalter; 02.08.2016