class ThymeleafEvaluationContextACLPropertyAccessor extends ReflectivePropertyAccessor {

        private final ReflectivePropertyAccessor propertyAccessor;

        ThymeleafEvaluationContextACLPropertyAccessor() {
            this(null);
        }

        ThymeleafEvaluationContextACLPropertyAccessor(final ReflectivePropertyAccessor propertyAccessor) {
            super(false); // allowWrite = false
            // propertyAccessor CAN be null
            this.propertyAccessor = propertyAccessor;
        }


        @Override
        public boolean canRead(final EvaluationContext context, final Object targetObject, final String name) throws AccessException {<FILL_FUNCTION_BODY>}

    }


            final boolean canRead;
            if (this.propertyAccessor != null) {
                canRead =  this.propertyAccessor.canRead(context, targetObject, name);
            } else {
                canRead = super.canRead(context, targetObject, name);
            }

            if (canRead) {
                // We need to perform the check on the getter equivalent to the member being called
                final String methodEquiv =
                        ("empty".equals(name) || "blank".equals(name)) ?
                            "is" + Character.toUpperCase(name.charAt(0)) + name.substring(1) :
                            "get" + Character.toUpperCase(name.charAt(0)) + name.substring(1);

                if (!ExpressionUtils.isMemberAllowed(targetObject, methodEquiv)) {
                    throw new EvaluationException(
                            String.format(
                                    "Accessing member '%s' is forbidden for type '%s' in this expression context.",
                                    name, targetObject.getClass()));
                }
            }

            return canRead;

        
<methods>public void <init>() ,public void <init>(java.lang.Object) ,public void addConstructorResolver(org.springframework.expression.ConstructorResolver) ,public void addMethodResolver(org.springframework.expression.MethodResolver) ,public void addPropertyAccessor(org.springframework.expression.PropertyAccessor) ,public org.springframework.expression.BeanResolver getBeanResolver() ,public List<org.springframework.expression.ConstructorResolver> getConstructorResolvers() ,public List<org.springframework.expression.MethodResolver> getMethodResolvers() ,public org.springframework.expression.OperatorOverloader getOperatorOverloader() ,public List<org.springframework.expression.PropertyAccessor> getPropertyAccessors() ,public org.springframework.expression.TypedValue getRootObject() ,public org.springframework.expression.TypeComparator getTypeComparator() ,public org.springframework.expression.TypeConverter getTypeConverter() ,public org.springframework.expression.TypeLocator getTypeLocator() ,public java.lang.Object lookupVariable(java.lang.String) ,public void registerFunction(java.lang.String, java.lang.reflect.Method) ,public void registerMethodFilter(Class<?>, org.springframework.expression.MethodFilter) throws java.lang.IllegalStateException,public boolean removeConstructorResolver(org.springframework.expression.ConstructorResolver) ,public boolean removeMethodResolver(org.springframework.expression.MethodResolver) ,public boolean removePropertyAccessor(org.springframework.expression.PropertyAccessor) ,public void setBeanResolver(org.springframework.expression.BeanResolver) ,public void setConstructorResolvers(List<org.springframework.expression.ConstructorResolver>) ,public void setMethodResolvers(List<org.springframework.expression.MethodResolver>) ,public void setOperatorOverloader(org.springframework.expression.OperatorOverloader) ,public void setPropertyAccessors(List<org.springframework.expression.PropertyAccessor>) ,public void setRootObject(java.lang.Object) ,public void setRootObject(java.lang.Object, org.springframework.core.convert.TypeDescriptor) ,public void setTypeComparator(org.springframework.expression.TypeComparator) ,public void setTypeConverter(org.springframework.expression.TypeConverter) ,public void setTypeLocator(org.springframework.expression.TypeLocator) ,public void setVariable(java.lang.String, java.lang.Object) ,public void setVariables(Map<java.lang.String,java.lang.Object>) <variables>private org.springframework.expression.BeanResolver beanResolver,private volatile List<org.springframework.expression.ConstructorResolver> constructorResolvers,private volatile List<org.springframework.expression.MethodResolver> methodResolvers,private org.springframework.expression.OperatorOverloader operatorOverloader,private volatile List<org.springframework.expression.PropertyAccessor> propertyAccessors,private volatile org.springframework.expression.spel.support.ReflectiveMethodResolver reflectiveMethodResolver,private org.springframework.expression.TypedValue rootObject,private org.springframework.expression.TypeComparator typeComparator,private org.springframework.expression.TypeConverter typeConverter,private org.springframework.expression.TypeLocator typeLocator,private final Map<java.lang.String,java.lang.Object> variables