java - 无法使用修饰符 "public final"访问 java.util.HashMap$Entry

标签 java glassfish hashmap

我的问题是,我的应用程序在本地 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

我怎样才能让它发挥作用?

最佳答案

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

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

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

关于java - 无法使用修饰符 "public final"访问 java.util.HashMap$Entry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12037489/

相关文章:

eclipse - 使用 eclipse 添加 glassfish 工具时出错

java.lang.ClassNotFoundException : org. glassfish.jersey.server.internal.inject.ExtractorException

java - 如何使用Java显示Glassfish数据?

c++ - google/dense_hash_map的线程安全

java : cannot set Map field

C++(哈希)映射速度优化

java - 使用 struts Logic taglib 生成选择选项

java - Google Drive Android API OAuth 身份验证问题 - onActivityResult 返回 "0"

java - 代码混淆排除 Getters 和 Setters

java - Android View 布局组件相互叠加