如何使用反射获取当前类中其他类中使用的对象?

时间:2014-08-05 05:12:22

标签: java swing reflection jlabel

我是反思概念的新手。我在一个类中有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();
    } 

有人可以帮助我吗?

3 个答案:

答案 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");