title: Creating classes dynamically with Java
body: <p>I have tried to find information about this but have come up empty handed:</p>
  
  <p>I gather it is possible to create a class dynamically in Java using reflection or proxies but I can't find out how. I'm implementing a simple database framework where I create the SQL queries using reflection. The method gets the object with the database fields as a parameter and creates the query based on that. But it would be very useful if I could also create the object itself dynamically so I wouldn't have the need to have a simple data wrapper object for each table.</p>
  
  <p>The dynamic classes would only need simple fields (<code>String</code>, <code>Integer</code>, <code>Double</code>), e.g.</p>
  
  <pre><code>public class Data {
    public Integer id;
    public String name;
  }
  </code></pre>
  
  <p>Is this possible and how would I do this?</p>
  
  <p>EDIT: This is how I would use this:</p>
  
  <pre><code>/** Creates an SQL query for updating a row's values in the database.
   *
   * @param entity Table name.
   * @param toUpdate Fields and values to update. All of the fields will be
   * updated, so each field must have a meaningful value!
   * @param idFields Fields used to identify the row(s).
   * @param ids Id values for id fields. Values must be in the same order as
   * the fields.
   * @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(",");
      }
  
      /* Remove last comma */
      sb.deleteCharAt(sb.toString().length()-1);
  
      /* Add where clause */
      sb.append(createWhereClause(idFields, ids));
  
      return sb.toString();
  }
   /** Formats a value for an sql query.
   *
   * This function assumes that the field type is equivalent to the field
   * in the database. In practice this means that this field support two
   * types of fields: string (varchar) and numeric.
   *
   * A string type field will be escaped with single parenthesis (') because
   * SQL databases expect that. Numbers are returned as-is.
   *
   * If the field is null, a string containing "NULL" is returned instead.
   * 
   * @param f The field where the value is.
   * @return Formatted value.
   */
  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;
  }
  </code></pre>