Java Ognl 表达式使用示例

601 阅读1分钟

Ognl说明

ognl

Maven pom.xml配置

<dependency>
    <groupId>ognl</groupId>
    <artifactId>ognl</artifactId>
    <version>3.2.6</version>
</dependency>

MemberAccess实现类配置

由于我们需要打破类的封装,所以要实现该接口

public class DefaultMemberAccess implements MemberAccess {

    public boolean allowPrivateAccess = false;
    public boolean allowProtectedAccess = false;
    public boolean allowPackageProtectedAccess = false;

    public DefaultMemberAccess(boolean allowAllAccess){
        this(allowAllAccess,allowAllAccess,allowAllAccess);
    }

    public DefaultMemberAccess(boolean allowPrivateAccess, boolean allowProtectedAccess, boolean allowPackageProtectedAccess){
        super();
        this.allowPrivateAccess = allowPrivateAccess;
        this.allowProtectedAccess = allowProtectedAccess;
        this.allowPackageProtectedAccess = allowPackageProtectedAccess;
    }

    @Override
    public Object setup(Map context, Object target, Member member, String propertyName) {
        Object result = null;
        if (isAccessible(context, target, member, propertyName)) {
           AccessibleObject    accessible = (AccessibleObject)member;
            if (!accessible.isAccessible()) {
                 result = Boolean.FALSE;
                 accessible.setAccessible(true);
            }
        }
        return result;
    }

    @Override
    public void restore(Map context, Object target, Member member, String propertyName, Object state) {
        if (state != null) {
            ((AccessibleObject) member).setAccessible(((Boolean) state).booleanValue());
        }
    }

    @Override
    public boolean isAccessible(Map map, Object o, Member member, String s) {
        int         modifiers = member.getModifiers();
        boolean     result = Modifier.isPublic(modifiers);

        if (!result) {
            if (Modifier.isPrivate(modifiers)) {
                result = isAllowPrivateAccess();
            } else {
                if (Modifier.isProtected(modifiers)) {
                    result = isAllowProtectedAccess();
                } else {
                    result = isAllowPackageProtectedAccess();
                }
            }
        }
        return result;
    }

    public boolean isAllowPrivateAccess() {
        return allowPrivateAccess;
    }

    public void setAllowPrivateAccess(boolean allowPrivateAccess) {
        this.allowPrivateAccess = allowPrivateAccess;
    }

    public boolean isAllowProtectedAccess() {
        return allowProtectedAccess;
    }

    public void setAllowProtectedAccess(boolean allowProtectedAccess) {
        this.allowProtectedAccess = allowProtectedAccess;
    }

    public boolean isAllowPackageProtectedAccess() {
        return allowPackageProtectedAccess;
    }

    public void setAllowPackageProtectedAccess(boolean allowPackageProtectedAccess) {
        this.allowPackageProtectedAccess = allowPackageProtectedAccess;
    }
}

使用案例

OgnlContext ognlContext = new OgnlContext(null, null, new DefaultMemberAccess(true));
ognlContext.put(keyContent, item);
String temExp = StringUtils.removeEnd(StringUtils.removeEnd(exp.toString(), "&&"),"||");
//判断
Object temp = Ognl.parseExpression(temExp);
Boolean bl = (Boolean) Ognl.getValue(temp, ognlContext, ognlContext.getRoot());
return bl.booleanValue();