反射静态方法参数字符串


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);

试试

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

传递 null 不是好主意,当方法需要对象...

也许这会有所帮助

使用单个空参数调用 Java varargs 方法?

首先

,你的支票对我来说似乎很奇怪:尝试if (pattern != null)而不是if (pattern != "")

你为什么不传递par数组,我认为你有非法的参数例外。 尝试传递参数数组。

Object[] args = {"someString / maybe null"};
ArrayList output = (ArrayList) mthd.invoke(null, args);

显然,您的调用调用类似于

initdata(null);

现在,在initdata内部,您不会过滤导致我们拨打电话的情况pattern == null

Star.find(null, 0);

我们不知道这种方法的实现 - 如果我们幸运的话,我们会得到一个空集合。否则,我希望在Star.find或以后NullPointerException mc.iterator()

$ 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

最新更新