gpt4 book ai didi

jsf-2 - java.lang.IllegalAccessException : can not access a member of class java. util.Collections$UnmodifyingCollection 带有修饰符 "public"

转载 作者:行者123 更新时间:2023-12-02 00:25:33 25 4
gpt4 key购买 nike

我有类PrimitivePropertyComplexProperty以及接口(interface)Property。我想创建一个 Property 的实现,它强制执行一个空的不可修改的 Property 实例集作为 Property.getProperties 的返回值,例如

public interface Property {
Set<Property> getProperties();
}

public class ComplexProperty implements Property {
private Set<Property> properties;
//getter overrides the interface method
}

public class PrimitiveProperty implements Property {
private final static Set<Property> EMPTY_PROPS = Collections.unmodifiableSet(new HashSet<Property>(1));

@Override
public Set<Property> getProperties() {
return EMPTY_PROPS;
}
}

使用 Glassfish 4.0,我得到了

java.lang.IllegalAccessException: Class javax.el.ELUtil can not access a member of class java.util.Collections$UnmodifiableCollection with modifiers "public"

当我访问 Richfaces treeleaf 属性中的属性时,例如

<r:tree id="aTree" 
toggleType="ajax" var="item" >
<r:treeModelRecursiveAdaptor roots="#{aCtrl.roots}"
nodes="#{item.properties}" leaf="#{item.properties.isEmpty()}">
<r:treeNode>
#{item.name}
</r:treeNode>
<r:treeModelAdaptor nodes="#{item.properties}" leaf="#{item.properties.isEmpty()}"/>
</r:treeModelRecursiveAdaptor>
</r:tree>

如果我使 EMPTY_PROPS 常量可修改(通过分配 HashSet 的实例而不是 Collections.unmodifyingSet 的返回值),问题就会消失)这不是我的本意。

有可能实现我想做的事情吗?我是否必须发明或使用与 JSF 访问需求兼容的 Collections$UnmodifyingCollection (子类)的实现?

最佳答案

问题是这样的:

leaf="#{item.properties.isEmpty()}"

您正在尝试直接在 UnmodifyingSet 实例上调用方法。尽管它实现了 Collection(即 public),但 UnmodifyingSet 实现本身,其中 EL(读取:Reflection API)尝试在该类不是 public

这个问题在纯 Java 中可以重现(main() 方法),如下所示:

Set<Object> set = Collections.unmodifiableSet(new HashSet<>());
for (Method method : set.getClass().getMethods()) {
if ("isEmpty".equals(method.getName())) {
method.invoke(set); // IllegalAccessException.
}
}

这本质上是所使用的 EL 实现中的一个错误。

你最好只使用EL自己的empty运算符:

leaf="#{empty item.properties}"

关于jsf-2 - java.lang.IllegalAccessException : can not access a member of class java. util.Collections$UnmodifyingCollection 带有修饰符 "public",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25020756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com