只有当对象具有特定注释时,才通过反射调用setText()



我试图通过反射设置一些不同组件(JButton, JLabel等)的文本。我还在我以后想要更改的字段中使用注释。

例如,我有以下代码:

public class MainWindow {
    @UsesTextChanger
    private JButton btn1;
    @UsesTextChanger
    private JLabel lb1;
    public void ChangeTexts() {
        for (Field field: MainWindow.class.getDeclaredFields()) {
            field.setAccessible(true);
            UsesTextChanger usesTextChanger = field.getAnnotation(UsesTextChanger.class);
            if (usesTextChanger != null){   
                try {
                    Method method = field.getType().getMethod("setText", new Class[]{String.class});
                    method.invoke(field, "my new text");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }       
    }
}

我得到以下异常:

java.lang.IllegalArgumentException: object is not an instance of declaring class

是否有方法获得此字段的实例,以便我可以正确调用setText()方法?

我还试图采取另一种方法,通过循环通过我的所有组件(代码只在第一层工作,现在虽然),实际上setText()工作,但我不知道如何检查是否有注释:

for (Component component: this.frame.getContentPane().getComponents()) {
    try {
        boolean componentUsesTextChangerAnnotation = true; // Is there a way to check if an annotation exists in an instanced object?
        if (componentUsesTextChangerAnnotation) {
            Method method = component.getClass().getMethod("setText", new Class[]{String.class});
            method.invoke(component, "my new text");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

谢谢!

您试图在Field上调用该方法-而您实际上想在对象内字段的上调用它。

你想:

Method method = field.getType().getMethod("setText", String.class);
Object target = field.get(this);
method.invoke(target, "my new text");

(我已经使用Class.getMethod有一个varargs参数来简化对它的调用,顺便说一句)

相关内容

  • 没有找到相关文章

最新更新