繁体   English   中英

与构造函数链接的混淆

[英]Confusion with Constructor chaining

我试图了解一些构造函数链接,我知道从同一个类的另一个构造函数调用一个构造函数称为构造函数链接,

当我们在构造函数中使用它时,实际上是在调用我们已经定义的另一个构造函数,但是我试图理解的程序很奇怪,

public AESCipher(Key key) {
        this(key.getEncoded());
    }

    /**
     * Create AESCipher based on existing {@link Key} and Initial Vector (iv) in bytes
     *
     * @param key Key
     */
    public AESCipher(Key key, byte[] iv) {
        this(key.getEncoded(), iv);
    }

    /**
     * <p>Create AESCipher using a byte[] array as a key</p>
     * <p/>
     * <p><strong>NOTE:</strong> Uses an Initial Vector of 16 0x0 bytes. This should not be used to create strong security.</p>
     *
     * @param key Key
     */
    public AESCipher(byte[] key) {
        this(key, INITIAL_IV);
    }

    private AESCipher(byte[] key, byte[] iv) {
        try {
            this.secretKeySpec = new SecretKeySpec(key, "AES");
            this.iv = new IvParameterSpec(iv);
            this.cipher = Cipher.getInstance(ALGORITHM_AES256);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            throw Throwables.propagate(e);
        }
    }

在第一个构造函数中,此行使用this(key.getEncoded()) ,该行调用哪个构造函数? 实际上没有构造函数,实际上没有一个参数的构造函数。

在第三个构造函数中,只有一个类型为byte[]参数,这就是内部发生的情况,

this(key, INITIAL_IV);

它正在链接一个带有两个参数的构造函数,一个是key类型,另一个是byte[]类型,因此它正在链接此构造函数AESCipher(Key key, byte[] iv) ,这很好,但仍然...发生了什么在第一个构造函数中,以及为什么首先需要4个构造函数。

PS:我只是没有发布这个问题,我花了大约4个小时试图了解正在发生的事情,但是它太令人困惑了。

这是完整的代码,

https://github.com/mike-ensor/aes-256-encryption-utility/blob/master/src/main/java/com/acquitygroup/encryption/AESCipher.java

第一个构造函数正在调用第三个构造函数: public AESCipher(byte[] key)

至于为什么首先有4个构造函数,它旨在封装将Key转换为byte[]的逻辑,并允许用户选择使用不同的初始向量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM