我有课程PrimitiveProperty
和ComplexProperty
以及界面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:类javax.el.ELUtil无法使用修饰符&#34; public&#34;
访问类java.util.Collections $ UnmodifiableCollection的成员
当我访问Richfaces leaf
的{{1}}属性中的属性时,例如
tree
如果我使<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
的返回值),这个问题就会消失。这不是我的意图。
有可能实现我想做的事吗?我是否必须发明或使用与JSF访问需求兼容的Collections.unmodifiableSet
(&#39; s子类)做的实现?
答案 0 :(得分:12)
问题在于:
leaf="#{item.properties.isEmpty()}"
您尝试直接在UnmodifiableSet
实例上调用方法。虽然它实现了Collection
public
,UnmodifiableSet
实现本身,其中EL(读取:Reflection API)试图在类上找到方法,但是不是< / em> 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}"