Java 使用字符串变量引用对象字段

Java 使用字符串变量引用对象字段,java,reflection,Java,Reflection,我有一个Book对象,其中有几个不同的字符串字段(标题、作者、主题…),我正在设计一个GUI来显示一组书籍的每个字段。我有一个面板,我希望每个字段都有一个标签(命名字段)、一个文本字段(显示字段中存储的值)和一个编辑按钮,该按钮使文本字段可编辑,并显示第二个按钮以保存所做的任何编辑 我想创建一个带有单个标签、TextField和按钮的“字段面板”,而不是将它们分别编码到面板中。然后我想使用foreach循环为每个字段创建一个面板(存储在列表中),并将这些面板加载到主面板中 我知道以下是不可能的:

我有一个Book对象,其中有几个不同的字符串字段(标题、作者、主题…),我正在设计一个GUI来显示一组书籍的每个字段。我有一个面板,我希望每个字段都有一个标签(命名字段)、一个文本字段(显示字段中存储的值)和一个编辑按钮,该按钮使文本字段可编辑,并显示第二个按钮以保存所做的任何编辑

我想创建一个带有单个标签、TextField和按钮的“字段面板”,而不是将它们分别编码到面板中。然后我想使用foreach循环为每个字段创建一个面板(存储在列表中),并将这些面板加载到主面板中

我知道以下是不可能的:

Book b = new Book();
String[] fieldTitles = {title, author, subject, publisher};
for (String str : fieldTitles) { 
    FieldPanel fp = new FieldPanel();
    fp.namelabel.settext(str);
    fp.textField.settext(b.str);
}

但是,有没有其他方法来实现我在最后一行尝试做的事情,即使用命名字符串变量来引用对象的字段?换句话说,我想做:
objectInstance.stringVariable
(其中stringVariable与objectInstance字段的名称相匹配。

您正在寻找反射。有一个关于这个主题的函数可以让您开始,然后有很多很多库可以让反射更容易,就像和中的一些类一样。几乎任何框架都会有某种反射elper类,因为直接使用反射太麻烦了

作为您案例的快速示例,使用,您可以说:

fp.textField.settext((String) BeanUtils.getProperty(b, str));
下面是一个完整的示例,以手动方式进行操作,这样您可以看到它是如何适应的:

import java.lang.reflect.Field;

public class BasicReflectionGettingFieldValues {
    public static void main(String[] args) {
        FieldPanel fp = new FieldPanel();
        Book b = new Book("Mostly Harmless", "Douglas Adams");
        for (String str : Arrays.asList("author", "title")) {
            fp.namelabel.settext(str);
            fp.textField.settext(getField(b, str));
        }
    }

    private static String getField(Book b, String str) {
        try {
            Field field = Book.class.getDeclaredField(str);
            field.setAccessible(true);
            return (String) field.get(b);
        } catch (NoSuchFieldException e) {
            throw new IllegalStateException("Bad field name: " + str, e);
        } catch (IllegalAccessException e) {
            throw new IllegalStateException("Failed to access field " + str + " after making it accessible", e);
        }
    }

    static class Book {
        private String title;
        private String author;

        Book(String title, String author) {
            this.title = title;
            this.author = author;
        }
    }
    static class TextField {
        void settext(String s) {
            System.out.println("Setting text field to '" + s + "'");
        }
    }
    static class NameLabel {
        void settext(String s) {
            System.out.println("Setting name label to '" + s + "'");
        }
    }
    static class FieldPanel {
        private NameLabel namelabel = new NameLabel();
        private TextField textField = new TextField();
    }
}

使用反射和类
字段
。您可以使用反射。但我不推荐使用反射,因为编译器无法以有趣的方式向您显示可能的语法错误。这是我们本周在课堂上要讨论的主题。您是否可以给我一个简单的sudocode示例,说明如何使用反射在这种情况下的e反射?这将帮助我了解一个概念,到目前为止,我只在摘要中了解这个概念。因此,在你的BeanUtils示例中,b是Book实例,str是for循环中使用的字符串。丑陋的手动方式看起来像什么?感谢帮助!之前意外提交了部分编辑。手动方式现在有:)