java.lang.reflect.field 字段为 JTextfield 时的 getText

java.lang.reflect.field getText when field is JTextfield

我有一个 class 超过 50 个 JTextfield 它们都包含文本

如何在不再次调用代码中的字段的情况下从所有文本字段中获取文本。

我试过了:

    Field[] fields = getClass().getDeclaredFields();       
    for (Field field : fields) {        
        if (field.getName().contains("_") == true) {
            // .getText();
        }
    }

然后我必须从字段中获取文本,但如何管理它?

或者有人对这些值有更好的想法??

您可以使用反射来确定字段的实际类型,例如:

Field[] fields = getClass().getDeclaredFields();       
for (Field field : fields) {  
    Class<?> fieldType = field.getType();
    if (fieldType.isAssignableFrom(JTextfield.class)) {
      JTextField jtf = (JTextField) field.get(owningobject);       
 ...

换句话说:

  1. 您可以检查字段 "is" 是否为 JTextField(即 比依赖名称中带有“_”的任何内容都是文本字段的约定要好 )
  2. 如果是这样,您只需 获取 字段的值,并将其转换为它的真实类型...然后,您将获得一个 JTextField 对象,您可以调用那个class直接的方法!

请注意:我的代码旨在让您继续使用 - 我没有 运行 通过编译器或对其进行测试。所以,当心错别字。但是自己做实验,帮助自己进步应该就够了。

编辑,关于您的问题:所有这些反射 get/set 方法都需要您 一些对象 才能处理。意思是:你需要一个 instance 的 class 你是 "reflecting" 的(除非你在谈论静态字段)。请参阅 here or there 以进一步阅读。

警告的最后一句话;因为有 两个 使用反射时你应该知道的事情:

  1. 只有在没有其他方法可以解决您的问题时才使用它。永远不要因为它看起来很方便而使用它,而是因为没有其他方法可以得到你需要的东西!
  2. 只有当你理解 100% 的反射时才使用它。问题是:超级容易得到反射错误。而且您只在 运行 时间注意到。您可以轻松地花费数小时编写反射代码并尝试使其工作; 运行从一个微妙的问题转向下一个问题。获取反射代码困难。更痛苦的是:代码的细微变化 "is reflected" 可以 破坏 使用反射的代码;直到 运行输入该代码,您才会注意到!

所以,长话短说,考虑到您的问题:您似乎了解反射。从这个意义上说:要非常小心。也许重新考虑是否有其他非反射性方法来解决您的问题!

正如满载鳗鱼的气垫船所建议的那样,一个干净的实现将问题分开:分组字段收集并对它们执行处理。 特别是,如果通过反射进行分组。
以下代码更具可读性和可维护性。

public class MyComponent extends JFrame{
  List<JTextField> fields = new ArrayList(); 

  private JTextField textField1;
  private JTextField textField2;
  private JTextField textField3;

  public MyComponent(){
   textField1 = new JTextField ("");
   textField2 = new JTextField ("");
   textField3 = new JTextField ("");
   addTextFieldInList(textField1, textField2, textField3);
  }

  public void addTextFieldInList(JTextField fieldArgs...) {
    fields.addAll(Arrays.asList(fieldArgs));
  }

  public void iterateAllTextFields(){
    for (JTextField field : fields){
      String yourValue = field.getText();
    }    
}

UPDATE 问题更新后指定处理句柄超过50个JTtextField.

在这种情况下,我提出的另一种解决方案可能更合适。 确实,对于十几个字段,忘记在列表中添加 JTextField 的可能性不大,但如果超过 50 个,我们可以理解这是一个容易出错的处理过程。创建您的自定义 JTextField 可能是更好的选择。 想法如下:使用新的 class JTextFieldWatched 扩展 JTextField 并使用附加参数强制 JTextFieldWatched 构造函数:注册 JTextField 实例的对象。

JTextFieldWatched 扩展 JTextField :

public class JTextFieldWatched extends JTextField{
  public JTextFieldWatched(String text, JTextFieldWatcher textFieldWatcher){
    super(text);
    if (textFieldWatcher==null){
      // force the constraint
      throw new IllegalArgumentException("textFieldWatcher is mandatory");
    }        
     textFieldWatcher.add(this);
  }
}

A class 注册了 JTextfield 个实例:

public class JTextFieldWatcher {
   List<JTextField> fields = new ArrayList(); 

   public void add(JTextField textField){
      fields.add(textField);
   }   

   public List<JTextField> getAllTextField(){
      return new ArrayList(fields);
   }
}

如何使用这些 classes:

public class MyComponent extends JFrame{
  private JTextFieldWatcher fieldsWatcher = new JTextFieldWatcher();

  private JTextFieldWatched textField1;
  private JTextFieldWatched textField2;
  private JTextFieldWatched textField3;

  public MyComponent(){
   textField1 = new JTextFieldWatched ("",fieldsWatcher);
   textField2 = new JTextFieldWatched ("",fieldsWatcher);
   textField3 = new JTextFieldWatched ("",fieldsWatcher);
  }   

  public void iterateAllTextFields(){
    for (JTextField field : fieldsWatcher.getAllTextField()){
      String yourValue = field.getText();
    }    
  }
}

所有代码都是手写的,没有IDE,如有错误请见谅