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