仅当对象具有特定注释时才通过反射调用 setText()
Invoking setText() through reflection only if an object has an specific annotaion
我正在尝试通过反射设置许多不同组件(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
有一个可变参数来简化对它的调用,顺便说一句。)
我正在尝试通过反射设置许多不同组件(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
有一个可变参数来简化对它的调用,顺便说一句。)