我是反射概念的新手。我在一个类中有JLabel,它是公共的,在另一个类,我得到了所有的公共字段,并检查它是否为JLabel类型,我想更改文本。为此,我使用了以下代码,这里我得到了所有字段,但我不能更改值,因为我从反射中得到的字段的类型是field。我想要实际的JLabel,如果我得到它,我可以更改它的值。这是我的代码。
Class clazz = LanguageTranslation.class;
Field[] fields = clazz.getFields();
for(Field f : fields ) {
try {
Class typ = f.getType();
System.out.println("Type is:"+f.getType()+"t Name:"+f.getName());
if(typ.equals(JLabel.class)) {
/*System.out.println("Field " + f.getName() + " of translation " + languageTranslation + " is a JLabel!");
typ.setText("Hiiiii");*/
System.out.println(f);
typ.setText("Hiiiii");//Setting the text for label but its not working
}
} catch ( SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
有人能帮我吗?
您需要LanguageTranslation
实例来获得JLabel
LanguageTranslation ltObject=//get it from your app logic
然后可以使用Field类的方法
public Object get(Object obj)
传递ltObject
并获得JLabel
实例。铸造后,您可以调用setText()
更新:读取命令后。如果您有LanguageTranslation
实例,您可以直接访问公共字段(包括JLabel(
typ.setText("Hiiiii");
不要在线上尝试在线下
f.setText("Hiiiii");
package com.test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.swing.JLabel;
public class LanguageTranslation {
public JLabel test;
public LanguageTranslation() {
test = new JLabel();
test.setText("Original");
}
public static void main(String[] args) {
LanguageTranslation obj = new LanguageTranslation();
System.out.println(obj.test.getText());
Class clazz = LanguageTranslation.class;
Field[] fields = clazz.getFields();
for (Field f : fields) {
try {
Class typ = f.getType();
System.out.println("Type is:" + f.getType() + "t Name:" + f.getName());
if (typ.equals(JLabel.class)) {
System.out.println(f);
try {
Method m = typ.getMethod("setText", String.class);
System.out.println(m);
m.invoke(obj.test, "Changed Value");
} catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
System.out.println(obj.test.getText());
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
}