java.lang.NoSuchMethodException: [Ljava.lang.reflect.Method; .myMethod (java.lang.String, логическое значение) - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь получить метод из класса, используя Java 1.7.

Очень странные вещи, если я печатаю methodName и его параметры, то же самое, что я использовал, но я всегда получаю: java.lang.NoSuchMethodException:

Вот мой код:

    public void invokeMethod(String className, String myMethod, List<Object> parametersMethod) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
    Class<?> cls = Class.forName(className);

    Method[] allMethods = cls.getDeclaredMethods();
    for(Method m : cls.getDeclaredMethods()){

        Type[] types = m.getParameterTypes();
        String tmp="";

        for (Type type : types) {
            tmp+=type+" ";
        }

        log.info(" " +m.getName()+" "+tmp); // 
    }
    Object obj = cls.newInstance();
    log.info("myMethod "+myMethod);

    Method m= allMethods.getClass().getMethod(myMethod, String.class, boolean.class); 
    log.info("m "+m.getName()+ "  "+m.getParameterTypes()+ "  "+m.getDefaultValue());
    m.invoke(obj, parametersMethod); }

Вот метод, который я пытаюсь вызвать:

public void tryIt(String myString, boolean mybool) throws Exception {
       //Do something
}

Log.info печатает: tryIt class java.lang.String boolean

Но я получаю (когда я пытаюсь использовать Method m= allMethods.getClass().getMethod(myMethod, String.class, boolean.class);):

java.lang.NoSuchMethodException: [Ljava.lang.reflect.Method;.tryIt (java.lang.String, boolean)

Я пытаюсь использовать Boolean вместо Boolean, но ничего не меняется.

invokeMethod находится на веб-сервисах, использующих Jboss7, и все мои классы @StateLess.

1 Ответ

0 голосов
/ 04 февраля 2019

allMethods имеет тип Method[], который не имеет метода tryIt(String, boolean).Вы хотите вызвать getMethod() для cls

Также вы вызываете неправильный метод, так как Method.invoke() ожидает массив аргументов не List, вам, вероятно, нужен такой метод:

public void invokeMethod(String className, String myMethod, Object... parametersMethod) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
    Class<?> cls = Class.forName(className);

    Object obj = cls.newInstance();

    Method m = cls.getMethod(myMethod, String.class, boolean.class);
    m.invoke(obj, parametersMethod);
}

Что можно назвать так:

invokeMethod("com.example.MyClass", "tryIt", "SomeString", true);
...