public static void generateConstructor(
      JavaClass jClass, String superClassName, Constructor baseCtor) {
    Class[] types = baseCtor.getParameterTypes();

    StringBuilder sb = new StringBuilder();
    createDescriptor(sb, types);
    sb.append("V");

    String descriptor = sb.toString();

    JavaMethod ctor = jClass.createMethod("<init>", descriptor);

    ctor.setAccessFlags(Modifier.PUBLIC);

    CodeWriterAttribute code = ctor.createCodeWriter();
    code.setMaxLocals(5 + 2 * types.length);
    code.setMaxStack(5 + 2 * types.length);

    code.pushObjectVar(0);

    marshal(code, types);

    code.invokespecial(superClassName, "<init>", descriptor, 1, 0);
    code.addReturn();
    code.close();
  }
  private void generateWriteReplace(JavaClass jClass) {
    JavaField jField = jClass.createField("__caucho_handle", "Ljava/lang/Object;");
    jField.setAccessFlags(Modifier.PRIVATE);

    JavaMethod jMethod = jClass.createMethod("writeReplace", "()Ljava/lang/Object;");

    jMethod.setAccessFlags(Modifier.PRIVATE);

    CodeWriterAttribute code = jMethod.createCodeWriter();
    code.setMaxLocals(5);
    code.setMaxStack(5);

    code.pushObjectVar(0);
    code.getField(jClass.getThisClass(), "__caucho_handle", "Ljava/lang/Object;");

    code.addObjectReturn();

    code.close();
  }
  private void generateSetHandle(JavaClass jClass) {
    /*
    JavaField jField
      = jClass.createField("__caucho_handle", "Ljava/lang/Object;");
    jField.setAccessFlags(Modifier.PRIVATE);
    */

    JavaMethod jMethod = jClass.createMethod("setSerializationHandle", "(Ljava/lang/Object;)V");

    jMethod.setAccessFlags(Modifier.PUBLIC);

    CodeWriterAttribute code = jMethod.createCodeWriter();
    code.setMaxLocals(5);
    code.setMaxStack(5);

    code.pushObjectVar(0);
    code.pushObjectVar(1);
    code.putField(jClass.getThisClass(), "__caucho_handle", "Ljava/lang/Object;");

    code.addReturn();

    code.close();
  }