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);
}
};
}