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



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

但不幸的是,在我的两个方法中,我都收到了StackOverflowError,看起来我的方法invoke被调用了不止一次。。。

我读了一些关于如何使用invoke方法的常见问题和教程,但我做错了。。。

有人能帮我吗?

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

}

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

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

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

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

这也适用于构造函数中的前一行:

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

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

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

看到递归了吗?new zad2()->new zad2()->new zad2()

请尝试使用this

相关内容

  • 没有找到相关文章

最新更新