【问题标题】:Cant access to java.util.HashMap$Entry with modifiers "public final"无法使用修饰符“public final”访问 java.util.HashMap$Entry
【发布时间】:2012-08-15 18:33:22
【问题描述】:

我的问题是,我的应用程序在 Tomcat 服务器上本地运行良好,但在安装 glassfish 的服务器上抛出错误。 整个问题是我在 JSTL 中遍历 HashMap。 服务器抛出如下堆栈:

Servlet.service() for servlet jsp threw exception java.lang.IllegalAccessException:
Class javax.el.BeanELResolver can not access a member of class java.util.HashMap$Entry with modifiers "public final" 
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95) 
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:261) 
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:253) 

问题是由代码引起的:

<c:forEach items="${element.getPreparedParameters()}" var="parametr" varStatus="j">
    documents["${i.index}"]["param"]=new Array();
    documents["${i.index}"]["param"]["key"] = "${parametr.getKey()}";
    documents["${i.index}"]["param"]["value"] = "${parametr.getValue()}";
</c:forEach>

element.getPreparedParameters() 返回HashMap

我怎样才能让它工作?

【问题讨论】:

    标签: java glassfish hashmap


    【解决方案1】:

    查看针对 Java 1.2 向 Sun 报告的 this decades-old bug(已在 Java 11 中修复)。我记得以前看到过这个错误,并且该消息具有误导性:问题不在于方法修饰符,而在于所属类的修饰符。即Map.Entry是一个公共接口,但HashMap中的实现类是私有的。即使您正在访问实现公共接口的方法,反射也不允许您访问该类的方法。

    我建议采用一种廉价的解决方法:不要遍历 entrySet,而是遍历 keySet 并使用 map.get(key) 而不是 entry.getValue()

    替代方案将更新到 Java 11 或更高版本。

    【讨论】:

    • 我今天的工作已经完成,但我明天早上试试。但问题是,为什么它可以在 Tomcat 服务器上运行?
    • 问题已解决。遍历 keySet 解决了这个问题。谢谢。
    • 这是非常低效的,因为在每次 get(x) 期间都会再次进行全图查找。
    • @CharlesFollet “非常低效”---按什么标准?你能量化它会增加响应时间的百分比吗?
    • @CharlesFollet 我不明白这一点。你是在从权威那里得到一个论据吗?他的建议显然不起作用,这就是为什么首先出现这个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多