java - 从 Java 代码访问对象类的 const 字段时为什么会出错
问题描述
来自 Kotlin文档
object Obj {
const val CONST = 1
}
应该足以从 Java 访问Obj.CONST
但与类似的它得到了错误。
object StringUtils {
const val UNESCAPE_HTML4 = "... ..."
......
}
在 Java 代码中
return StringUtils.UNESCAPE_HTML4;
出现错误
'UNESCAPE_HTML4' has private access in com.data.utils.StringUtils
必须使用StringUtils.INSTANCE.getUNESCAPE_HTML4()
然后没有错误。
单击它UNESCAPE_HTML4
确实会正确打开已编译的代码。
唯一的区别是这个对象 StringUtils 来自已添加到项目的 build.gradle 的库依赖项
有人也看到这种类型的错误吗?
这是Java端的一个测试函数,它试图从依赖库中访问那些函数、属性。
public class DataWrapper {
... ...
public void test_strUtil() {
/*
* For example, the string "<Français>"
* will become "<Franais>"
*/
String s = StringUtils.unescapeHtml4("&lt;Fran&ccedil;ais&gt;");
int s2 = Constants.CONTROLLER_FANTASY_SPORTS_STREAM;
String[][] arr = EntityArrays.BASIC_UNESCAPE();
Log.i("+++", "+++ test_strUtil(), after DataPlay.init(), unescapeHtml4:"+s+", empty:"
+StringUtils.EMPTY+" --- s2:"+s2);
for (int i=0; i<arr.length; i++) {
String[] arrRow = arr[i];
for (int j=0; j< arrRow.length; j++) {
Log.w("+++", "+++ arrRow["+i+"]["+j+"]:"+arrRow[j]);
}
}
}
IDE 在它们上显示红色并显示“非静态方法...”,
或“有私人访问权……”
但是当点击抱怨的函数或属性时,它确实会打开正确的编译文件
和
当它运行时,打印输出显示正确调用的函数。
com.test.debug I/+++: +++ test_strUtil(), after DataPlay.init(),
unescapeHtml4:<Français>, empty: --- s2:3
com.test.debug W/+++: +++ arrRow[0][0]:"
+++ arrRow[0][1]:"
+++ arrRow[1][0]:&
+++ arrRow[1][1]:&
+++ arrRow[2][0]:<
+++ arrRow[2][1]:<
+++ arrRow[3][0]:>
+++ arrRow[3][1]:>
更奇怪的是,来自同一个库的其他函数和属性通过不同对象类的 const 或 @JvmStatic 暴露,它们不会被 IDE 抱怨。
解决方案
这里有几点:
- 错误只出现在IDE中,编译期间不出现
- 仅当类在库中时发生(我试图在同一个项目中重现类的问题,它按预期工作)
如果清理/重建没有帮助,删除整个项目并再次导入它应该。
推荐阅读
- python - 如何在谷歌图表中创建箱线图?
- zip4j - Zip4J 和 Zip Slip 漏洞
- html - 引导问题:列之间没有空间,页脚和部分之间不需要额外的空间
- jquery - 移动内部 div 从开始 CSS Jquery Javascript 重复
- android - java.lang.IllegalArgumentException:无法在资产文件夹中找到包含嵌套文件的配置根
- java - 谁能解释为什么 JUnit 测试会出错?
- mongodb - 使用查找、匹配的 mongodb 聚合查询
- select - 选择角度 6 选项的问题
- python - TensorFlow 均方误差计算与 sklearn 不同
- ios - UIImageJPEGRepresentation 已被实例方法 UIImage.jpegData(compressionQuality:) 替换