我有一个java类,它包含数据库表的所有列作为属性(成员变量)以及相应的getter和setter。
我希望在这个名为getColumnCount()
的类中有一个返回列数的方法(即类中的属性数)?如果不对数字进行硬编码,我将如何实现?我对这方面的批评和建议持开放态度。感谢。
答案 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);
}
任何评论都欢迎并且编码愉快。