当前位置: 首页 > 知识库问答 >
问题:

Gson类中的VerifyError

缑智敏
2023-03-14
DynamicType.Unloaded unloaded = new ByteBuddy().with(TypeValidation.DISABLED).rebase(typeDescription,
                ClassFileLocator.Simple.of(className, classBytes,
                        ClassFileLocator.ForClassLoader.of((ClassLoader) classLoader))).method(
                ElementMatchers.isPackagePrivate().and(ElementMatchers.not(ElementMatchers.isAbstract()))).intercept(
                MethodDelegation.to(PackagePrivateInterceptor.class)).transform(
                MethodTransformer.Simple.withModifiers(Visibility.PUBLIC)).make();
        return new ClassPair(unloaded.load((ClassLoader) classLoader,
                ClassLoadingStrategy.Default.INJECTION.withProtectionDomain(
                        classLoader.getClass().getProtectionDomain())).getLoaded(), unloaded.getBytes());

当加载类类com.google.gson.internal.constructorConstructor

它遍历构造函数,直到最后到达com.google.gson.internal.LinkedTreemap的类初始化器。

在初始化期间,我得到一个VerifyError:

1:24:20.227 [main] ERROR   [io.hakansson.dynamicjar.core.main.Bootstrap] - java.lang.RuntimeException: java.lang.VerifyError: Illegal type at constant pool entry 195 in class com.google.gson.internal.LinkedTreeMap$1
Exception Details:
  Location:
    com/google/gson/internal/LinkedTreeMap$1.thenComparing$accessor$vT023QbO(Ljava/util/function/Function;)Ljava/util/Comparator; @2: invokespecial
  Reason:
    Constant pool index 195 is invalid
  Bytecode:
    0x0000000: 2a2b b700 c3b0                         

    at io.hakansson.dynamicjar.core.api.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:52)
    at io.hakansson.dynamicjar.core.main.Bootstrap.main(Bootstrap.java:42)
Caused by: java.lang.VerifyError: Illegal type at constant pool entry 195 in class com.google.gson.internal.LinkedTreeMap$1
Exception Details:
  Location:
    com/google/gson/internal/LinkedTreeMap$1.thenComparing$accessor$vT023QbO(Ljava/util/function/Function;)Ljava/util/Comparator; @2: invokespecial
  Reason:
    Constant pool index 195 is invalid
  Bytecode:
    0x0000000: 2a2b b700 c3b0                         

    at com.google.gson.internal.LinkedTreeMap.classInitializer$oNOjADym(LinkedTreeMap.java:40)
    at com.google.gson.internal.LinkedTreeMap.(LinkedTreeMap.java)
    at com.google.gson.internal.ConstructorConstructor$13.construct$original$gt92dwVY(ConstructorConstructor.java:207)
    at com.google.gson.internal.ConstructorConstructor$13.construct$original$gt92dwVY$accessor$lof1omy8(ConstructorConstructor.java)
    at com.google.gson.internal.ConstructorConstructor$13$auxiliary$oB71rVyd.call(Unknown Source)
    at io.hakansson.dynamicjar.nestedjarclassloader.PackagePrivateInterceptor.intercept(PackagePrivateInterceptor.java:29)
    at com.google.gson.internal.ConstructorConstructor$13.construct(ConstructorConstructor.java)
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:167)
    at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read$original$ZTjOtCtb(ReflectiveTypeAdapterFactory.java:116)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read$original$ZTjOtCtb$accessor$WgRdwpwl(ReflectiveTypeAdapterFactory.java)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1$auxiliary$41HBhnNS.call(Unknown Source)
    at io.hakansson.dynamicjar.nestedjarclassloader.PackagePrivateInterceptor.intercept(PackagePrivateInterceptor.java:29)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:216)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read$original$bOjIYDn5(TypeAdapterRuntimeTypeWrapper.java:40)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read$original$bOjIYDn5$accessor$hMWEZRZS(TypeAdapterRuntimeTypeWrapper.java)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper$auxiliary$U1tyihKy.call(Unknown Source)
    at io.hakansson.dynamicjar.nestedjarclassloader.PackagePrivateInterceptor.intercept(PackagePrivateInterceptor.java:29)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read$original$ZTjOtCtb(ReflectiveTypeAdapterFactory.java:116)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read$original$ZTjOtCtb$accessor$WgRdwpwl(ReflectiveTypeAdapterFactory.java)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1$auxiliary$41HBhnNS.call(Unknown Source)
    at io.hakansson.dynamicjar.nestedjarclassloader.PackagePrivateInterceptor.intercept(PackagePrivateInterceptor.java:29)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:216)
    at com.google.gson.Gson.fromJson(Gson.java:879)
    at com.google.gson.Gson.fromJson(Gson.java:817)
@RuntimeType
@BindingPriority(1)
public static Object intercept(@SuperCall Callable<?> superCall, @Origin Class targetClass, @Origin String method) throws
        Exception
{

    Class callingClass = new InternalSecurityManager().getCallingClass();
    String targetPackage = targetClass.getPackage().getName();
    if (!callingClass.getPackage().getName().equals(targetPackage)) {
        throw new IllegalAccessError(callingClass + " cannot access method " + method + " of Class " + targetClass);
    }

    //Default:
    return superCall.call();
}

private static class InternalSecurityManager extends SecurityManager {
    Class getCallingClass() {
        Class[] classContext = getClassContext();
        for (Class current : classContext) {
            if (current.getName().startsWith("java.") ||
                    current.getName().equals(PackagePrivateInterceptor.class.getName()) ||
                    current.getName().equals(InternalSecurityManager.class.getName()))
            {
                continue;
            }
            return current;
        }
        throw new IllegalStateException("Failed to find calling Class");
    }
}
//Only package-private methods should be proxied.
            DynamicType.Unloaded unloaded = new ByteBuddy().with(TypeValidation.DISABLED).rebase(typeDescription,
                    ClassFileLocator.Simple.of(className, classBytes,
                            ClassFileLocator.ForClassLoader.of((ClassLoader) classLoader))).method(
                    ElementMatchers.isPackagePrivate().and(ElementMatchers.not(ElementMatchers.isAbstract()))).intercept(
                    MethodDelegation.to(PackagePrivateInterceptor.class)).transform(
                    MethodTransformer.Simple.withModifiers(Visibility.PUBLIC)).make();
            DynamicType.Loaded loaded = unloaded.load((ClassLoader) classLoader,
                    ClassLoadingStrategy.Default.INJECTION.withProtectionDomain(
                            classLoader.getClass().getProtectionDomain()));
            if (className.equals("com.google.gson.internal.LinkedTreeMap"))
                System.out.println(DatatypeConverter.printHexBinary(loaded.getBytes()));
            return new ClassPair(loaded.getLoaded(), unloaded.getBytes());

但以下是:

//All non-private methods should be proxied
            //TODO: Actually, the class itself should be made visible and still only package-private methods should be proxied.
            DynamicType.Unloaded unloaded = new ByteBuddy().with(TypeValidation.DISABLED).rebase(typeDescription,
                    ClassFileLocator.Simple.of(className, classBytes,
                            ClassFileLocator.ForClassLoader.of((ClassLoader) classLoader))).method(
                    ElementMatchers.not(ElementMatchers.isPrivate()).and(
                            ElementMatchers.not(ElementMatchers.isAbstract()))).intercept(
                    MethodDelegation.to(PackagePrivateInterceptor.class)).transform(
                    MethodTransformer.Simple.withModifiers(Visibility.PUBLIC)).make();
            return new ClassPair(unloaded.load((ClassLoader) classLoader,
                    ClassLoadingStrategy.Default.INJECTION.withProtectionDomain(
                            classLoader.getClass().getProtectionDomain())).getLoaded(), unloaded.getBytes());

共有1个答案

端木昱
2023-03-14

这确实是Byte Buddy中的一个bug。问题是,您将Java6类重新建立在Java8 VM上,其中carable接口实现了几个默认方法。您指示Byte Buddy重写这些方法,还指示库从重写的实现中调用这些默认方法。这对于Java6类文件是不合法的,即使VM运行的是Java8。

如果我让你的匹配者:

not(isPrivate().or(isAbstract()).or(isDefaultMethod()))

错误消失了。我将在Byte Buddy的未来版本中修复这个问题。

Byte Buddy或ASM当前都没有捕捉到此错误,这将产生奇怪的错误消息。

更新:该错误现在在1.4.13版本中得到解决。

 类似资料:
  • 主要内容:类声明,构造函数,类方法,继承的方法Gson是Google Gson库的主要操作类。 它提供了将Java对象转换为匹配的JSON结构的功能,反之亦然。 Gson首先使用构建,然后使用或方法读取/写入JSON构造。 类声明 以下是类的声明 - 构造函数 编号 构造函数 说明 1 用默认配置构造一个对象。 类方法 编号 方法 描述 1 此方法将从指定分析树读取的Json反序列化为指定类型的对象。 2 此方法将从指定分析树读取的Json反

  • 我有一个来自服务器的JSON字符串,我无法控制它 我通过编程使用jsonschema2pojo库生成了Java类 我正在使用GSON将JSON反序列化到我的Java对象中。 下面是JSON的一个例子。 “50”子类实际上只是18个类中的一个,它们的名称类似于一个数字 当jsonschema2pojo生成Java类时,可以理解它会在前面加一个下划线来创建类名(所以,_50)。 jsonschema2

  • 我有以下类层次结构 改装日志: 但是当我在请求参数中发布事件实例时,只有抽象类被序列化。 改型Java接口: 我还注意到,在第二种情况下,字段序列化名称是,但它应该是!这使我认为改型对使用的与对参数使用的不同... 分级依赖关系 REST客户端

  • 问题内容: 我有以下的JSON,我只有在获得元素感兴趣,和。 使用 Gson ,可以解析此JSON以获取那些值,而无需创建表示JSON内容的整个类结构吗? JSON: 问题答案: 您无需定义任何新类,只需使用Gson库随附的JSON对象即可。这是一个简单的例子: 干净利落。如果发现自己一遍又一遍地重复相同的代码,则可以创建类来简化映射并消除重复。

  • 问题内容: 我有这样的Java POJO类: 我有一个像这样的Kotlin数据类 如何在java变量中提供给诸如注解之类的任何变量? 问题答案: 资料类别: 到JSON: 从JSON:

  • 主要内容:嵌套内部类示例,嵌套的静态内部类示例在本章中,我们将解释具有内部类的类的序列化/反序列化。 嵌套内部类示例 参考以下示例代码片段 - 示例 让我们来看看一个内部类的序列化/反序列化。 创建一个名为的Java类文件:GsonTester.java - 执行上面示例代码,得到以下结果 - 嵌套的静态内部类示例 参考以下代码实现 - 示例 我们来看一个实例,其中包含一个静态内部类的序列化/反序列化。 创建一个名为的Java类文件:Gson