public MetaProperty getEffectiveGetMetaProperty()

in src/main/java/groovy/lang/MetaClassImpl.java [1934:2072]


    public MetaProperty getEffectiveGetMetaProperty(final Class sender, final Object object, String name, final boolean useSuper) {

        //----------------------------------------------------------------------
        // handling of static
        //----------------------------------------------------------------------
        boolean isStatic = (theClass != Class.class && object instanceof Class);
        if (isStatic && object != theClass) {
            return new ReadOnlyMetaProperty(name) {
                @Override
                public Object getProperty(final Object receiver) {
                    MetaClass mc = registry.getMetaClass((Class<?>) receiver);
                    return mc.getProperty(sender, receiver, getName(), useSuper, false);
                }
            };
        }

        checkInitalised();

        //----------------------------------------------------------------------
        // getter
        //----------------------------------------------------------------------
        Tuple2<MetaMethod, MetaProperty> methodAndProperty = createMetaMethodAndMetaProperty(sender, name, useSuper, isStatic);
        MetaMethod method = methodAndProperty.getV1();

        if (method == null || isSpecialProperty(name)) {
            //------------------------------------------------------------------
            // public field
            //------------------------------------------------------------------
            MetaProperty mp = methodAndProperty.getV2();
            if (mp != null && mp.isPublic()) {
                return mp;
            }

            //------------------------------------------------------------------
            // java.util.Map get method
            //------------------------------------------------------------------
            if (isMap && !isStatic) {
                return new ReadOnlyMetaProperty(name) {
                    @Override
                    public Object getProperty(final Object receiver) {
                        return ((Map<?,?>) receiver).get(getName());
                    }
                };
            }

            //------------------------------------------------------------------
            // non-public field
            //------------------------------------------------------------------
            if (mp != null) {
                return mp;
            }
        }

        //----------------------------------------------------------------------
        // java.util.Map get method before non-public getter -- see GROOVY-11367
        //----------------------------------------------------------------------
        if (isMap && !isStatic && !method.isPublic()) {
            return new ReadOnlyMetaProperty(name) {
                @Override
                public Object getProperty(final Object receiver) {
                    return ((Map<?,?>) receiver).get(getName());
                }
            };
        }

        if (method != null) {
            return new GetBeanMethodMetaProperty(name, VM_PLUGIN.transformMetaMethod(this, method));
        }

        //----------------------------------------------------------------------
        // generic get method
        //----------------------------------------------------------------------
        if (!useSuper && !isStatic && GroovyCategorySupport.hasCategoryInCurrentThread()) {
            method = getCategoryMethodGetter(theClass, "get", true);
            if (null == method) {
                method = getCategoryMethodGetter(theClass, PROPERTY_MISSING, true);
            }
            if (method != null) {
                return new GetMethodMetaProperty(name, VM_PLUGIN.transformMetaMethod(this, method));
            }
        }
        if (genericGetMethod != null && (genericGetMethod.isStatic() || !isStatic)) {
            return new GetMethodMetaProperty(name, VM_PLUGIN.transformMetaMethod(this, genericGetMethod));
        }

        //----------------------------------------------------------------------
        // special cases
        //----------------------------------------------------------------------
        if (theClass != Class.class && object instanceof Class) {
            return new ReadOnlyMetaProperty(name) {
                @Override
                public Object getProperty(final Object receiver) {
                    MetaClass cmc = registry.getMetaClass(Class.class);
                    return cmc.getProperty(Class.class, receiver, getName(), false, false);
                }
            };
        }
        if (object instanceof Collection) {
            return new ReadOnlyMetaProperty(name) {
                @Override
                public Object getProperty(final Object receiver) {
                    return DefaultGroovyMethods.getAt((Collection<?>) receiver, getName());
                }
            };
        }
        if (object instanceof Object[]) {
            return new ReadOnlyMetaProperty(name) {
                @Override
                public Object getProperty(final Object receiver) {
                    return DefaultGroovyMethods.getAt(Arrays.asList((Object[]) receiver), getName());
                }
            };
        }
        MetaMethod addListenerMethod = listeners.get(name);
        if (addListenerMethod != null) {
            return new ReadOnlyMetaProperty(name) {
                @Override
                public Object getProperty(final Object receiver) { return null; }
            };
        }

        //----------------------------------------------------------------------
        // error due to missing method/field
        //----------------------------------------------------------------------
        if (isStatic || object instanceof Class) {
            return new ReadOnlyMetaProperty(name) {
                @Override
                public Object getProperty(final Object receiver) {
                    return invokeStaticMissingProperty(receiver, getName(), null, true);
                }
            };
        }
        return new ReadOnlyMetaProperty(name) {
            @Override
            public Object getProperty(final Object receiver) {
                return invokeMissingProperty(receiver, getName(), null, true);
            }
        };
    }