首页 > 解决方案 > 从 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("<Français>");



    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:&lt;Fran&ccedil;ais&gt;, empty: --- s2:3
com.test.debug W/+++: +++ arrRow[0][0]:&quot;
    +++ arrRow[0][1]:"
    +++ arrRow[1][0]:&amp;
    +++ arrRow[1][1]:&
    +++ arrRow[2][0]:&lt;
    +++ arrRow[2][1]:<
    +++ arrRow[3][0]:&gt;
    +++ arrRow[3][1]:>

更奇怪的是,来自同一个库的其他函数和属性通过不同对象类的 const 或 @JvmStatic 暴露,它们不会被 IDE 抱怨。

标签: javakotlin

解决方案


这里有几点:

  1. 错误只出现在IDE中,编译期间不出现
  2. 仅当类在库中时发生(我试图在同一个项目中重现类的问题,它按预期工作)

如果清理/重建没有帮助,删除整个项目并再次导入它应该。


推荐阅读