使用Java动态创建类。

16 浏览
0 Comments

使用Java动态创建类。

我试过找相关的信息,但是一无所获:

我了解到在Java中可以使用反射或代理来动态创建类,但我找不到具体的方法。我正在实现一个简单的数据库框架,其中使用反射来创建SQL查询语句。该方法接收一个带有数据库字段的对象作为参数,并根据该对象创建查询语句。但如果我能动态创建对象本身,那将非常有用,这样我就不需要为每个表格都创建一个简单的数据包装对象了。

动态创建的类只需要简单的字段(String、Integer、Double),例如:

public class Data {
  public Integer id;
  public String name;
}

这是否可行?如何实现?

编辑:以下是我将如何使用此功能:

/**
 * 创建一个用于更新数据库中行的值的SQL查询语句。
 *
 * @param entity 表名。
 * @param toUpdate 需要更新的字段和值。所有字段将被更新,因此每个字段必须具有有意义的值!
 * @param idFields 用于标识行的字段。
 * @param ids id字段的值。值必须与字段的顺序相同。
 * @return
 */
@Override
public String updateItem(String entity, Object toUpdate, String[] idFields,
        String[] ids) {
    StringBuilder sb = new StringBuilder();
    sb.append("UPDATE ");
    sb.append(entity);
    sb.append("SET ");
    for (Field f: toUpdate.getClass().getDeclaredFields()) {
        String fieldName = f.getName();
        String value = new String();
        sb.append(fieldName);
        sb.append("=");
        sb.append(formatValue(f));
        sb.append(",");
    }
    /* 删除最后一个逗号 */
    sb.deleteCharAt(sb.toString().length()-1);
    /* 添加where子句 */
    sb.append(createWhereClause(idFields, ids));
    return sb.toString();
}
/**
 * 格式化用于SQL查询的值。
 *
 * 此函数假设字段类型与数据库中的字段等效。实际上,这意味着该字段支持两种类型的字段:字符串(varchar)和数字。
 *
 * 字符串类型字段将使用单引号(')转义,因为SQL数据库期望如此。数字则原样返回。
 *
 * 如果字段为null,则返回一个包含"NULL"的字符串。
 *
 * @param f 值所在的字段。
 * @return 格式化后的值。
 */
String formatValue(Field f) {
    String retval = null;
    String type = f.getClass().getName();
    if (type.equals("String")) {
        try {
            String value = (String)f.get(f);
            if (value != null) {
                retval = "'" + value + "'";
            } else {
                retval = "NULL";
            }
        } catch (Exception e) {
            System.err.println("No such field: " + e.getMessage());
        }
    } else if (type.equals("Integer")) {
        try {
            Integer value = (Integer)f.get(f);
            if (value != null) {
                retval = String.valueOf(value);
            } else {
                retval = "NULL";
            }
        } catch (Exception e) {
            System.err.println("No such field: " + e.getMessage());
        }
    } else {
        try {
            String value = (String) f.get(f);
            if (value != null) {
                retval = value;
            } else {
                retval = "NULL";
            }
        } catch (Exception e) {
            System.err.println("No such field: " + e.getMessage());
        }
    }
    return retval;
}

0