【发布时间】:2015-09-04 05:43:04
【问题描述】:
我正在尝试通过反射设置多个不同组件(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();
}
}
谢谢!
【问题讨论】:
-
您可以使用您的第一种方法,将
MainWindow.class.getDeclaredFields()替换为component.getClass().getDeclaredFields()对吧?
标签: java reflection field invoke