当前位置: 首页 > 面试题库 >

Java中的Kotlin内部类公开可见

祁曦哲
2023-03-14
问题内容

我正在Kotlin中开发一个Android
密码库。我有几个internal类在Java应用程序中公开可见。在文档中找到了这一点。

internal声明成为publicJava。internal类的成员会经历名称重整,以使其更难从Java中意外使用它们,并允许重载具有相同签名但根据Kotlin规则彼此不可见的成员。

有办法解决这个问题吗?


问题答案:

我已经看到您所有的内部类都涉及加密和解密。

您可以通过定义一个顶级函数并将其标记为
@JvmSynthetic,然后将ECryptSymmetricDecrypt和ECryptSymmetricEncrypt类设为
私有
来防止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在实现类下隐藏操作。理想情况下,客户端代码无法java.security.*通过EncryptDecrypt接口看到任何类。例如:

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

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


它是您创建一个实例和计算结果是坏事init块这里。

并且 您可以使用Factory Method
Pattern避免在ECryptSymmetricDecrypt和ECryptSymmetricEncrypt类中进行类型检查。



 类似资料:
  • 问题内容: 如果存在Kotlin语言,可以用什么替代方法?如果没有,当我需要在Kotlin中使用时如何解决此问题?请参见下面的代码示例: 我搜索了很多东西,没有发现任何东西,非常感谢。 问题答案: 只需在Kotlin中省略。 内部类(持有对外部对象的引用) Java: 科特林: 静态内部类又称为嵌套类(不引用外部对象) Java: 科特林:

  • 访问级别修饰符如何改变内部私有类中成员的行为?我有这个密码 属性是私有的:我可以从Main访问它,但不能从Main外部访问它(因为Inner是私有的) 属性是public的:我仍然可以从Main访问它,但不能从Main外部访问它(因为Inner是private的) 我看不出有什么不同

  • 我在学习Java中读到关于内部班级的文章。我找到了这个密码 编译后,javap的动物$Brain输出为 这解释了内部类如何在内部类构造函数中获取对其封闭实例的引用。但是当我像这样将内部类定义为private时 然后编译后,javap'动物$Brain'给出输出为 那么为什么输出不同呢?为什么没有显示内部类构造函数?在后一种情况下,内部类也获得了封闭类实例的引用。

  • 假设您正在编写一个Android项目(不是库)。所有文件都编译在一起,因此......在这种情况下使用可见性修饰符有任何意义吗?

  • 我无法理解内部访问修饰符。在我的例子中,我无法产生任何与公共行为不同的情况。即使我创建了一个jar,我也可以从jar外部访问jar中的内部函数(来自与jar中使用的包无关的不同包)。在文档中使用了术语模块,但我无法找到模块的确切含义。 因此,我的问题是: > kotlin中的模块是什么? 内部访问修饰符与公共修饰符有何不同?

  • 问题内容: 如果仍然无法在包含类的外部访问它,则用Java声明一个私有内部类的成员的原因是什么?可以吗 问题答案: 如果该类没有扩展任何类或实现任何接口,那么我认为这是无稽之谈,因为没有其他类可以访问它的任何实例。 但是,如果它扩展或实现了任何其他非私有类或接口,则是有意义的。一个例子: