public static Method getReadMethod()

in src/main/java/org/apache/commons/ognl/OgnlRuntime.java [1785:1878]


    public static Method getReadMethod( Class<?> target, String name, int numParms )
    {
        try
        {
            name = name.replace( "\"", "" ).toLowerCase();

            BeanInfo info = Introspector.getBeanInfo( target );
            MethodDescriptor[] methodDescriptors = info.getMethodDescriptors();

            // exact matches first

            Method method = null;

            for ( MethodDescriptor methodDescriptor : methodDescriptors )
            {
                if ( !isMethodCallable( methodDescriptor.getMethod() ) )
                {
                    continue;
                }

                String methodName = methodDescriptor.getName();
                String lowerMethodName = methodName.toLowerCase();
                int methodParamLen = methodDescriptor.getMethod().getParameterTypes().length;

                if ( ( methodName.equalsIgnoreCase( name ) || lowerMethodName.equals( "get" + name )
                    || lowerMethodName.equals( "has" + name ) || lowerMethodName.equals( "is" + name ) )
                    && !methodName.startsWith( "set" ) )
                {
                    if ( numParms > 0 && methodParamLen == numParms )
                    {
                        return methodDescriptor.getMethod();
                    }
                    if ( numParms < 0 )
                    {
                        if ( methodName.equals( name ) )
                        {
                            return methodDescriptor.getMethod();
                        }
                        if ( method == null || ( method.getParameterTypes().length > methodParamLen ) )
                        {
                            method = methodDescriptor.getMethod();
                        }
                    }
                }
            }

            if ( method != null )
            {
                return method;
            }

            for ( MethodDescriptor methodDescriptor : methodDescriptors )
            {
                if ( !isMethodCallable( methodDescriptor.getMethod() ) )
                {
                    continue;
                }

                if ( methodDescriptor.getName().toLowerCase().endsWith( name ) && !methodDescriptor.getName().startsWith( "set" )
                    && methodDescriptor.getMethod().getReturnType() != Void.TYPE )
                {

                    if ( numParms > 0 && methodDescriptor.getMethod().getParameterTypes().length == numParms )
                    {
                        return methodDescriptor.getMethod();
                    }
                    if ( (numParms < 0) && (method == null || ( method.getParameterTypes().length
                        > methodDescriptor.getMethod().getParameterTypes().length )) )
                    {
                        method = methodDescriptor.getMethod();
                    }
                }
            }

            if ( method != null )
            {
                return method;
            }

            // try one last time adding a get to beginning

            if ( !name.startsWith( "get" ) )
            {
                return OgnlRuntime.getReadMethod( target, "get" + name, numParms );
            }

        }
        catch ( Throwable t )
        {
            throw OgnlOps.castToRuntime( t );
        }

        return null;
    }