无法使用修饰符访问java.util.HashMap$条目;公开决赛;

无法使用修饰符访问java.util.HashMap$条目;公开决赛;,java,glassfish,hashmap,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 j

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

文档[“${i.index}”][“param”]=new Array();
文档[“${i.index}”][“param”][“key”]=“${parametr.getKey()}”;
文档[“${i.index}”][“param”][“value”]=“${parametr.getValue()}”;
其中
element.getPreparedParameters()
返回
HashMap

如何使其工作?

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

我建议采用一种廉价的解决方法:不要迭代
入口集
,而是迭代
键集
,使用
map.get(key)
而不是
entry.getValue()


另一种选择是升级到Java 11或更高版本。

我今天的工作已经完成,但明天早上我会试试。但问题是,为什么它在Tomcat服务器上工作?问题解决了。迭代键集修复了该问题。谢谢。这是非常低效的,因为在每次get(x)期间都会再次进行完整的地图查找。@CharlesFollet“非常低效”——以什么标准?你能量化它会增加响应时间的百分比吗?@CharlesFollet我看不出有什么意义。你是在从权威那里提出论点吗?他的建议显然不起作用,这就是为什么这个问题首先出现的原因。