反射静态方法参数字符串

时间:2011-05-18 07:23:26

标签: java reflection

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 个答案:

答案 0 :(得分:2)

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

当方法需要Object ...

时,传递null并不是一个好主意

可能会有所帮助

Calling Java varargs method with single null argument?

答案 1 :(得分:0)

首先,您的支票对我来说似乎很奇怪:尝试if (pattern != null)代替if (pattern != "")

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

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

答案 2 :(得分:0)

显然,您的调用呼叫与

类似
initdata(null);

现在,在initdata内,您不会过滤pattern == null引导我们进行通话的情况

Star.find(null, 0);

我们不知道这种方法的实现 - 如果我们很幸运,我们会得到一个空集合。否则,我希望在NullPointerExceptionStar.find

之后mc.iterator() {{1}}

答案 3 :(得分:0)

$ 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