为什么使用反射调用会导致StackOverflowError?

时间:2014-05-12 20:49:01

标签: java reflection

我正在学习Java中的反射,我有一点问题 - 我想调用两个方法 - 首先我想设置我的jframe的位置,然后在第二个方法中添加按钮。

但遗憾的是,在我的两种方法中,我收到了StackOverflowError,看起来我的方法调用被多次调用了......

我阅读了一些有关如何使用调用方法的常见问题和教程,但我做错了...

有人可以帮帮我吗?

public class zad2 extends JFrame{

public int setLocationtest(int x, int y){

    setLocation(x,y);
    return 1;
}
public void addButton(String txt){

    add(new JButton("Przycisk 1"+txt));

}


    zad2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        super("tytuł");
        getContentPane().setLayout (new GridLayout(2,2));
        setSize(300,300);
        setLocation(350,50);



        Method testMethod = zad2.class.getDeclaredMethod("setLocationtest", Integer.TYPE, Integer.TYPE);
        testMethod.setAccessible(true);
        testMethod.invoke(new zad2(), 10, 10);
        //setLocationtest(20,50);

        Method testMethodbt = zad2.class.getDeclaredMethod("addButton", String.class);

        testMethodbt.invoke(new zad2(), "1");

        setVisible(true);       

    }

public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    new zad2();

}

}

2 个答案:

答案 0 :(得分:2)

您的构造函数zad2正在此处创建另一个zad2实例:

testMethodbt.invoke(new zad2(), "1");

那将在另一个实例上调用相同的构造函数,该实例将创建自己的new zad2(),依此类推,这将持续到堆栈溢出为止。

如果您打算在当前实例上调用该方法,请传递this而不是新的zad2

这也适用于构造函数中的早期行:

testMethod.invoke(new zad2(), 10, 10);

当然,它提出了为什么需要反射的问题,当一个直接的方法调用就足够了。

答案 1 :(得分:1)

zad2() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    // blah blah . . .
    testMethod.invoke(new zad2(), 10, 10);

看到递归? new zad2() - > new zad2() - > new zad2()。 。

请尝试使用this