java.lang.IllegalAccessException:无法使用修饰符“public”访问类java.util.Collections $ UnmodifiableCollection的成员

时间:2014-07-29 16:49:25

标签: jsf-2 el

我有课程PrimitivePropertyComplexProperty以及界面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.E​​LUtil无法使用修饰符&#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子类)做的实现?

1 个答案:

答案 0 :(得分:12)

问题在于:

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

您尝试直接在UnmodifiableSet实例上调用方法。虽然它实现了Collection publicUnmodifiableSet实现本身,其中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}"