CodeQL 文档

可外部化的,但没有公共无参数构造函数

ID: java/missing-no-arg-constructor-on-externalizable
Kind: problem
Security severity: 
Severity: warning
Precision: medium
Tags:
   - reliability
   - maintainability
   - language-features
Query suites:
   - java-security-and-quality.qls

单击以查看 CodeQL 存储库中的查询

实现 java.io.Externalizable 的类必须有一个公共无参数构造函数。在反序列化期间创建对象时,Java 序列化框架会使用该构造函数。如果该类没有定义此类构造函数,则 Java 序列化框架会抛出 InvalidClassException

用于 Externalizable 的 Java 开发工具包 API 文档指出

重建 Externalizable 对象时,将使用公共无参数构造函数创建一个实例,然后调用 readExternal 方法。

建议

确保可外部化的类始终有一个无参数构造函数。

示例

在以下示例中,WrongMemo 没有声明公共无参数构造函数。当 Java 序列化框架尝试反序列化对象时,会抛出 InvalidClassException。但是,Memo 声明了一个公共无参数构造函数,因此对象反序列化成功。

class WrongMemo implements Externalizable {
    private String memo;

    // BAD: No public no-argument constructor is defined. Deserializing this object
    // causes an 'InvalidClassException'.

    public WrongMemo(String memo) {
        this.memo = memo;
    }

    public void writeExternal(ObjectOutput arg0) throws IOException {
        //...
    }
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        //...
    }
}

class Memo implements Externalizable {
    private String memo;

    // GOOD: Declare a public no-argument constructor, which is used by the
    // serialization framework when the object is deserialized.
    public Memo() {
    }

    public Memo(String memo) {
        this.memo = memo;
    }

    public void writeExternal(ObjectOutput out) throws IOException {
        //...
    }
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        //...
    }
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私