无法访问具有修饰符“public final”的java.util.HashMap $ Entry。 [英] Cant access to java.util.HashMap$Entry with modifiers "public final"
问题描述
我的问题是,我的应用在Tomcat服务器上本地运行良好,但在安装了glassfish的服务器上发生错误。
整个问题是我正在通过JSTL中的HashMap进行迭代。
服务器抛出一个堆栈,如下所示:
servlet jsp的Servlet.service()抛出异常java.lang.IllegalAccessException :
类javax.el.BeanELResolver无法访问类java.util.HashMap $ Entry的成员具有修饰符public final
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:261)$ b $ at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:253)
$ b问题是由代码造成的:
< c:forEach items =$ {element.getPreparedParameters()}var =parametrvarStatus =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()
code> HashMap 。
如何让它成功?
解决方案查看这个数十年前的错误报告给Sun针对Java 1.2。我记得之前看到这个错误,并且这个消息有误导性:问题不在于方法修饰符,而在于拥有类的修饰符。也就是说,
Map.Entry
是一个公共接口,但是HashMap
中的实现类是私有的。即使您正在访问实现公共接口的方法,反射也不允许您访问类的方法。
我建议使用廉价的解决方法:不要遍历
entrySet
,而是遍历keySet
,并使用map.get键)
而不是entry.getValue()
。My problem is, that my app works fine run locally on Tomcat server, but throws errors on server with installed glassfish. Whole problem is that i'm iterate looking through HashMap in JSTL. Server throws an stack as below:
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)
problem is caused by code:
<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>
Where
element.getPreparedParameters()
returnsHashMap
.How can i make it work?
解决方案Check out this decades-old bug reported to Sun against Java 1.2. I remember seeing this error before and the message is misleading: the problem lies not with the method modifiers, but with the modifiers on the owning class. Namely,
Map.Entry
is a public interface, but the implementing class inHashMap
is private. Reflection doesn't allow you to access the methods of the class even though you are accessing methods that implement a public interface.I'd suggest going for a cheap workaround: don't iterate over the
entrySet
, but over thekeySet
and usemap.get(key)
instead ofentry.getValue()
.这篇关于无法访问具有修饰符“public final”的java.util.HashMap $ Entry。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!