如何获取java类中的属性数?

时间:2010-04-21 18:06:47

标签: java class

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

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

4 个答案:

答案 0 :(得分:23)

检查reflection API。如果有问题的类实际上是 pure Javabean,您可以按如下方式获取字段数(属性或列的名称):

public int getColumnCount() {
    return getClass().getDeclaredFields().length;
}
然而,我高度质疑这一点的必要性。如果您详细说明您认为需要这种方法/解决方案的功能需求,那么我们可能会建议更好的方法。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

制作类似“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;
}

答案 3 :(得分:0)

我曾经和你一样有着相同的目的,然后用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);
}

任何评论都欢迎并且编码愉快。