有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我对反思的概念是新的。我在一个类中有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) 个答案

  1. # 1 楼答案

    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 楼答案

    您需要LanguageTranslation实例来获取JLabel

    LanguageTranslation ltObject=//get it from your app logic
    

    然后可以使用Field类的方法

    public Object get(Object obj)
    

    传递ltObject并获得JLabel实例。在施法后,你可以调用setText()

    更新:阅读commetns后。如果有LanguageTranslation实例,可以直接访问公共字段(包括JLabel)

  3. # 3 楼答案

     typ.setText("Hiiiii");
    

    不要站在线上,而要站在线下

    f.setText("Hiiiii");