Failed to invoke public xxx with no args 的原因及解决办法

admin 2021-11-11 PM 3040℃ 0条

前言

从服务器拿到Json数据后,使用Gson反序列化数据到实体类中,但如下错误:

java.lang.RuntimeException: Failed to invoke public xxx.CmdPayload() with no args

从英文的提示中我们得到如下信息:

  • 不能执行无参函数:CmdPayload()
  • CmdPayload()是一个构造函数

结论:在反序列化数据的时候,在newInstance这个步骤就出现错误,而不是基本上类的错误。

原因分析

为何会出现这个错误呢?我们先来看一下我给出的实体类结构:

abstract class CmdPayload{

private String cmd;
private int time;

}

由于下一层还有一个子类继承CmdPayload,所以需要使用了abstract来修饰。我们都知道,抽象类是不可以被初始化,也就是说不能new或者newInstance操作。

上面的报错信息指向我们没有办法进行newInstance操作(反序列化其实就是利用java的反射技术,执行class类的newInstace方法来得到一个对象),所以得到结论:因为无法初始化,所以报:Failed to invoke public xxx.CmdPayload() with no args这个错误。

分析定位到报错原因后,得出解决办法:去掉abstract修饰符,允许通过反射得到对象,然后进行相关的注入操作。

标签: Gson

非特殊说明,本博所有文章均为博主原创。

评论已关闭