无法访问 java.util.HashMap$Entry with modifiers “public final”

2022-09-03 13:44:53

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

我怎样才能让它工作?


答案 1

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

我建议采用便宜的解决方法:不要迭代 ,而是迭代 and 使用 而不是 .entrySetkeySetmap.get(key)entry.getValue()

另一种方法是更新到Java 11或更高版本。


答案 2