gpt4 book ai didi

java - 对 Swing 组件的反射(reflection)

转载 作者:行者123 更新时间:2023-12-01 18:09:28 25 4
gpt4 key购买 nike

我正在尝试通过反射为 swing 组件分配一个值。我们以 JCheckBox 为例。我有以下类(class):

public class JCheckBoxTest
{
private JCheckBox test;

public JCheckBoxTest()
{
this.test = new JCheckBox();
}

public reflectionTest()
{
Field field;
Method method;

field = this.getClass().getDeclaredField("test");
method = field.getType().getSuperclass().getDeclaredMethod("setSelected");

method.invoke(field, "true");
}
}

此代码失败于:

method = field.getType().getSuperclass().getDeclaredMethod("setSelected");

因为它找不到指定的“setSelected”方法,因为它位于由“JCheckBox”类扩展的父类(super class)“JToggleButton”的内部类“ToggleButtonModel”内。

解决这个问题的最佳方法是什么?

谢谢。

编辑:更正代码中的拼写错误。

最佳答案

Class#getMethodClass#getDeclaredMethod 都提供了提供方法名称和可选参数的方法

JCheckBox#setSelected 需要一个 boolean 参数,所以你真的应该使用

method = field.getClass().getDeclaredMethod("setSelected", boolean.class);

但正如您所指出的,这不太可能起作用,相反,您可以尝试

method = field.getClass().getMethod("setSelected", boolean.class);

现在,我也遇到了这个失败的情况,这就是为什么我倾向于使用类似的东西......

public static Method findMethod(Class parent, String name, Class... parameters) throws NoSuchMethodException {

Method method = null;
try {
method = parent.getDeclaredMethod(name, parameters);
} catch (NoSuchMethodException exp) {
try {
method = parent.getMethod(name, parameters);
} catch (NoSuchMethodException nsm) {
if (parent.getSuperclass() != null) {
method = findMethod(parent.getSuperclass(), name, parameters);
} else {
throw new NoSuchMethodException("Could not find " + name);
}
}
}
return method;
}

这有点暴力。

考虑到这一点......

JCheckBox cb = new JCheckBox();
try {
Method method = cb.getClass().getDeclaredMethod("setSelected", boolean.class);
System.out.println("1. " + method);
} catch (NoSuchMethodException | SecurityException ex) {
ex.printStackTrace();
}
try {
Method method = cb.getClass().getMethod("setSelected", boolean.class);
System.out.println("2. " + method);
} catch (NoSuchMethodException | SecurityException ex) {
ex.printStackTrace();
}
try {
Method method = findMethod(cb.getClass(), "setSelected", boolean.class);
System.out.println("3. " + method);
} catch (NoSuchMethodException ex) {
ex.printStackTrace();
}

输出类似...

java.lang.NoSuchMethodException: javax.swing.JCheckBox.setSelected(boolean)
2. public void javax.swing.AbstractButton.setSelected(boolean)
3. public void javax.swing.AbstractButton.setSelected(boolean)
at java.lang.Class.getDeclaredMethod(Class.java:2130)
at test.Test.main(Test.java:13)

免责声明

这样的反射(reflection)应该是最后的手段。它很慢并且容易进行代码重构

关于java - 对 Swing 组件的反射(reflection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34011992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com