Java中的Kotlin内部类可公开显示

我正在Kotlin开发一个Android 加密库 。 我有一些在Java应用程序中公开可见的internal类。 在文件中找到这个 。

internal声明在Java中publicinternal类的成员通过名称修改,使它更难以从Java意外使用它们,并允许根据Kotlin规则相同签名的成员不能相互看到的成员超载;

有没有办法解决这个问题?

我已经看到你所有的内部类都是关于加密和解密的 。

您可以通过定义顶级函数并将其标记为@JvmSynthetic ,然后使ECryptSymmetricDecrypt和ECryptSymmetricEncrypt类为private来防止Java客户端访问您的内部类,从而轻松完成此操作,例如:

 // define this top-level function in your ECryptSymmetricEncrypt.kt @JvmSynthetic internal fun <T> encrypt( input:T, password: String, cipher:Cihper, erl: ECryptResultListener, outputFile:File, getKey:(String,ByteArray)->SecretKeySpec){ ECryptSymmetricEncrypt(input, password, cipher, { pass, salt -> getKey(pass, salt) }, erl, outputFile) } 

然而,它解决了你的问题,但我仍然想说,你的代码可以进一步分解成小块。 例如,加密和解密算法有很多重复,也许你可以在你的加密库中应用模板方法模式 ,并引入接口来明确地制作你的库,并在实现类下隐藏Cipher操作。 理想情况下,客户端代码不能通过EncryptDecrypt接口看到任何java.security.*类。 例如:

 interface Encrypt{ // v--- don't include the infrastructure class here,eg:`Keys`,`Cipher` fun encode(...args) } interface Decrypt{ // v--- don't include the infrastructure class here,eg:`Keys`,`Cipher` fun decode(...args) } 

在这里创建一个实例并在init块中计算结果是一件坏事。

而且您可以使用Factory Method Pattern来避免ECryptSymmetricDecrypt和ECryptSymmetricEncrypt类中的类型检查。

Interesting Posts