public static Object callBeanMethod()

in src/main/java/org/apache/bsf/util/EngineUtils.java [181:271]


    public static Object callBeanMethod (final Object bean, final String methodName,
                                         final Object[] args) throws BSFException {
        Class[] argTypes = null;
        // determine arg types. note that a null argtype
        // matches any object type

        if (args != null) {
            argTypes = new Class[args.length];
            for (int i = 0; i < args.length; i++) {
                argTypes[i] = (args[i] == null) ? null : args[i].getClass ();
            }
        }

        // we want to allow a static call to occur on an object, similar
        // to what Java allows. So isStaticOnly is set to false.
        final boolean isStaticOnly = false;
        final Class beanClass = (bean instanceof Class) ? (Class)bean :
                                                    bean.getClass ();

        // now try to call method with the right signature
  	try {
  	  Method m;
  	  try {
  	m = MethodUtils.getMethod (beanClass, methodName, argTypes,
  				       isStaticOnly);
  	  } catch (final NoSuchMethodException e) {
  	// ok, so that didn't work - now try converting any primitive
  	// wrapper types to their primitive counterparts
  	try {
  	  // if args is null the NullPointerException will get caught
  	  // below and the right thing'll happen .. ugly but works
  	  for (int i = 0; i < args.length; i++) {
             if (args[i] instanceof Number)
             {
                 if      (args[i] instanceof Byte) {
                    argTypes[i] = byte.class;
                } else if (args[i] instanceof Integer) {
                    argTypes[i] = int.class;
                } else if (args[i] instanceof Long) {
                    argTypes[i] = long.class;
                } else if (args[i] instanceof Float) {
                    argTypes[i] = float.class;
                } else if (args[i] instanceof Double ) {
                    argTypes[i] = double.class;
                } else if (args[i] instanceof Short  ) {
                    argTypes[i] = short.class;
                }
             }
             else if (args[i] instanceof Boolean) {
                argTypes[i] = boolean.class;
            } else if (args[i] instanceof Character) {
                argTypes[i] = char.class;
            }
  	  }

  	  m = MethodUtils.getMethod (beanClass, methodName, argTypes,
  					 isStaticOnly);
  	} catch (final Exception e2) {
  	  // throw the original
  	  throw e;
  	}
  	  }

  	  // call it, and return the result
        try {
            return m.invoke (bean, args);
        }
        catch (final Exception e)                   // 2003-02-23, --rgf, maybe an IllegalAccessException?
        {
            if (e instanceof IllegalAccessException &&
                bMethodHasSetAccessible &&
                Modifier.isPublic(m.getModifiers())   )   // if a public method allow access to it
            {
                m.setAccessible(true);        // allow unconditional access to method
  	        return m.invoke (bean, args);
            }
  	  // re-throw the exception
  	  throw e;
        }

        } catch (final Exception e) {
            // something went wrong while invoking method
            final Throwable t = (e instanceof InvocationTargetException) ?
                          ((InvocationTargetException)e).getTargetException () :
                          null;
            throw new BSFException (BSFException.REASON_OTHER_ERROR,
                                    "[EngineUtils.callBeanMethod()] method invocation failed: " + e +
                                    ((t==null) ? "" :
                                     (" target exception: " + t)), t);
        }
    }