【问题标题】:How to get number of attributes in a java class?如何获取java类中的属性数量?
【发布时间】:2010-04-21 18:06:46
【问题描述】:

我有一个 java 类,其中包含数据库表的所有列作为属性(成员变量)以及相应的 getter 和 setter。

我想在这个类中有一个名为getColumnCount() 的方法,它返回列数(即类中的属性数)?如果不对数字进行硬编码,我将如何实现这一点?我对一般性的批评和建议持开放态度。谢谢。

【问题讨论】:

  • 你可以通过反射来做到这一点,但为什么你需要知道这个数字呢?我觉得可能有更好的方法来做你想做的事情。

标签: java class


【解决方案1】:

检查reflection API。如果有问题的类实际上是一个 pure Javabean,您可以获得字段数(您称之为属性或列),如下所示:

public int getColumnCount() {
    return getClass().getDeclaredFields().length;
}

然而,我强烈质疑这样做的必要性。如果您详细说明您认为需要此方法/解决方案的功能要求,那么我们可能会提出更好的方法。

【讨论】:

  • 谢谢,这行得通。就推理而言,主要是为了记录:我需要知道表中的列数,以便在更新期间跟踪字段中的旧新数据。列数是必需的,因此日志记录类知道要插入到登录表中的行数。
  • 如果您使用的是不错的 ORM API,您可以使用 API 提供的方法来计算映射细节。 JPA 和优秀的 Hibernate 可以做到这一点。
  • 是的。不幸的是,我正在使用的代码没有使用 ORM API。
  • 好的,不客气,祝你代码好运。如果您有更多问题,您知道找到我们。
【解决方案2】:

一种方法是使用反射列出类的方法并计算名称与正则表达式“^set.+$”匹配的方法。

【讨论】:

    【解决方案3】:

    制作像“DatabaseColumn”这样的注释,使用它来映射哪些字段到表列。 您可以对字段或 getter 方法使用注释。因此对于数据库表中未使用的临时字段是安全的。

    // in this sample annotation used for getter methods
    public int getColumnCount() {
        int count = 0;
        Method[] methods = getClass().getDeclaredMethods(); 
        for (Method method : methods) {
            if (method.isAnnotationPresent(DatabaseColumn.class)) {
                count++;
            }
        }
        return count;
    }
    

    【讨论】:

      【解决方案4】:

      我曾经和你有同样的目的,然后做了一个由 Java 反射驱动的函数来解决这个问题。

      我想我可以帮你。

      /**
       * author: Amo
       * to use auto-gen SQL create command to create a table having columns named same as the name of model fields
       */
      public void setSQLCreateCmd(Class<?> clazz) {
          Field[] fields = clazz.getDeclaredFields();
          String fieldName;
          Class<?> fieldType;
          int fieldCount = fields.length;
          Log.d("[DEBUG]", "... fieldCount:" + fieldCount);
          int i = 0;
          DATABASE_CMD = "create table if not exists " + DATABASE_NAME +
                          "(" +
                          "_id integer primary key autoincrement, ";
          for (Field field : fields) {
              if (!field.isAccessible()) field.setAccessible(true);
              fieldName = field.getName();
              fieldType = field.getType();
              if (fieldName.compareTo("") == 0) {
                  Logger.d("!!! field name is empty");
                  continue;
              }
              if (i == fieldCount - 1) {
                  Logger.d("... field at " + (i+1) + "named " + fieldName);
                  if (fieldType.equals(String.class)) DATABASE_CMD += fieldName + " text" + ")";
                  else if (fieldType.equals(int.class) || fieldType.equals(Integer.class))  DATABASE_CMD += fieldName + " integer" + ")";
              } else {
                  Logger.d("... field at " + (i+1) + "named " + fieldName);
                  if (fieldType.equals(String.class)) DATABASE_CMD += fieldName + " text" + ",";
                  else if (fieldType.equals(int.class) || fieldType.equals(Integer.class)) DATABASE_CMD += fieldName + " integer" + ",";
              }
              i++;
          }
          /**
           * fixes fieldCount is not as same as the defined
           */
          StringBuilder stringBuilder = new StringBuilder(DATABASE_CMD);
          stringBuilder.setCharAt(stringBuilder.lastIndexOf(","), ')');
          DATABASE_CMD = stringBuilder.toString();
          Log.d("[DEBUG]", "... now sql cmd is " + DATABASE_CMD);
          Logger.d("... now sql cmd is " + DATABASE_CMD);
      }
      

      欢迎任何评论,祝您编码愉快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 2022-01-12
        • 2018-08-12
        • 2013-11-15
        • 2011-07-19
        • 1970-01-01
        相关资源
        最近更新 更多