Строка аргумента статического метода отражения - PullRequest
0 голосов
/ 18 мая 2011
public class Star{  
    public static ArrayList initdata(String pattern) {
        ArrayList data = new ArrayList();
            if (pattern != "") {
                ModelCollection mc = Star.find(pattern, 0);
                Iterator dataIterator = mc.iterator();
                    while (dataIterator.hasNext()) {
                        Star star = (Star) dataIterator.next();
                        data.add(star.getName());
                        Debug.trace("StarName" + star.getName());
                    }
            }
        Collections.sort(data);
        return data;
    }
}

Я хочу вызвать метод initdata, используя отражение, я пытался написать что-то вроде этого, но это не работает:

Class c = Class.forName("com.cubiware.fyretv.application.model.Star");
par[0] = String.class;
Method mthd = c.getMethod("initdata", par);        
ArrayList output = (ArrayList) mthd.invoke(null, null);

Ответы [ 4 ]

2 голосов
/ 18 мая 2011

try

ArrayList output = (ArrayList) mthd.invoke(null, (String)null);

Не рекомендуется передавать значение null, когда метод ожидает Object ...

Может быть, это поможет

Вызов Javaметод varargs с одним нулевым аргументом?

0 голосов
/ 18 мая 2011
$ javac -cp dp4j-1.2-SNAPSHOT-jar-with-dependencies.jar -Averbose -All Star.java
Star.java:12:

import com.dp4j.*;

public class Star {

    public Star() {
        super();
    }

    public static ArrayList initdata(String pattern) {
        return null;
    }

    @Reflect()
    public static void main(String[] args) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException, java.lang.IllegalArgumentException {
        final java.lang.reflect.Method initdataWithStringMethod = Class.forName("Star").getDeclaredMethod("initdata", .java.lang.String.class);
        initdataWithStringMethod.setAccessible(true);
        initdataWithStringMethod.invoke("", new .java.lang.Object[1][]{null});
        final java.lang.reflect.Method printlnWithStringMethod = Class.forName("java.io.PrintStream").getDeclaredMethod("println", .java.lang.String.class);
        printlnWithStringMethod.setAccessible(true);
        printlnWithStringMethod.invoke(System.out, new .java.lang.Object[1][]{"Varargs + reflection? No problem"});
    }
}
    public static void main(String args[]) {
                       ^

$ java Star
Varargs + reflection? No problem
0 голосов
/ 18 мая 2011

Очевидно, ваш вызов вызова похож на

initdata(null);

Теперь внутри initdata вы не фильтруете случай, когда pattern == null, который приводит нас к звонку

Star.find(null, 0);

Мы не знаем реализацию этого метода - если нам повезет, мы получим пустую коллекцию. В противном случае, я ожидаю NullPointerException в Star.find или позже в mc.iterator()

0 голосов
/ 18 мая 2011

Во-первых, ваша проверка кажется мне странной: попробуйте if (pattern != null) вместо if (pattern != "").

Почему бы вам не передать массив par, у вас есть недопустимое исключение аргумента, я думаю.попробуйте передать массив аргументов.

Object[] args = {"someString / maybe null"};
ArrayList output = (ArrayList) mthd.invoke(null, args);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...