我正在学习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
。