无法访问具有修饰符“public final”的java.util.HashMap $ Entry。 [英] Cant access to java.util.HashMap$Entry with modifiers "public final"

查看:469
本文介绍了无法访问具有修饰符“public final”的java.util.HashMap $ Entry。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题是,我的应用在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() returns HashMap.

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 in HashMap 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 the keySet and use map.get(key) instead of entry.getValue().

这篇关于无法访问具有修饰符“public final”的java.util.HashMap $ Entry。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆