我正在学习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();
}
}
答案 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
。