我是反思概念的新手。我在一个类中有JLabel并且它是公共的,在另一个类中我获取所有公共字段并检查它是否是JLabel类型,我想要更改文本。为此,我使用以下代码,这里我得到所有字段,但我不能更改值,因为我从反射获得的字段是类型字段我想要实际的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();
}
有人可以帮助我吗?
答案 0 :(得分:1)
您需要LanguageTranslation
个实例才能获得JLabel
LanguageTranslation ltObject=//get it from your app logic
然后你可以使用Field类的方法
public Object get(Object obj)
您传递ltObject
并获取JLabel
实例。投射后你可以拨打setText()
更新:阅读完公告后。如果您拥有LanguageTranslation
实例,则可以直接访问公共字段(包括JLabel)
答案 1 :(得分:-2)
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();
}
}
}
}
答案 2 :(得分:-2)
typ.setText("Hiiiii");
而不是上面的行尝试下面的行
f.setText("Hiiiii");