public static Optional<Object> invokeMethod(Object target, String methodName, Class<?>[] paramsType,
            Object[] params) {
        if (methodName == null || target == null) {
            return Optional.empty();
        }
        final Optional<Method> method = findMethod(target.getClass(), methodName, paramsType);
        if (method.isPresent()) {
            return invokeMethod(target, method.get(), params);
        }
        return Optional.empty();
    }
@Test
    public void testInvokeMethod1() {
        int params = 88;
        final Optional<Object> staticMethod = ReflectUtils
                .invokeMethod(TestReflect.class, "staticMethod", new Class[]{int.class},
                        new Object[]{params});
        Assert.assertTrue(staticMethod.isPresent() && staticMethod.get() instanceof String);
        Assert.assertEquals(TestReflect.staticMethod(params), staticMethod.get());

        // can not find method
        final Optional<Object> test = ReflectUtils.invokeMethod(TestReflect.class, "test", new Class[]{int.class},
                new Object[]{params});
        Assert.assertFalse(test.isPresent());

    }