Java中的Kotlin内部类可公开显示
我正在Kotlin开发一个Android 加密库 。 我有一些在Java应用程序中公开可见的internal
类。 在文件中find这个 。
internal
声明在Java中public
。internal
类的成员通过名称修改,使它更难以从Java意外使用它们,并允许根据Kotlin规则相同签名的成员不能相互看到的成员超载;
有没有办法解决这个问题?
我已经看到你所有的内部类都是关于加密和解密的 。
您可以通过定义顶级函数并将其标记为@JvmSynthetic
,然后使ECryptSymmetricDecrypt和ECryptSymmetricEncrypt类为private来防止Java客户端访问您的内部类,从而轻松完成此操作,例如:
// define this top-level function in your ECryptSymmetricEncrypt.kt @JvmSynthetic internal fun 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
操作。 理想情况下,客户端代码不能通过Encrypt
或Decrypt
接口看到任何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类中的types检查。
除了@JvmSynthetic
,你可以使用带有非法Java标识符的@JvmName
,比如添加一个空格。
例如,我在@JvmName
参数中添加了一个空格,所以除了Kotlin之外的任何语言都不能调用你的方法:
@JvmName(" example") internal fun example() { }