@SuppressWarnings("unused")
  private Object createFactory(Class<?> cls, Constructor<?> contructor) {
    String newClassName = cls.getName() + "Factory";
    ASMHelper helper = new ASMHelper();
    ClassWriter cw = helper.createClassWriter();
    MethodVisitor mv;

    cw.visit(
        Opcodes.V1_6,
        Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER,
        ASMHelper.periodToSlashes(newClassName),
        null,
        "java/lang/Object",
        null);

    cw.visitSource(cls.getSimpleName() + "Factory" + ".java", null);

    mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    mv =
        cw.visitMethod(
            Opcodes.ACC_PUBLIC,
            "create" + cls.getSimpleName(),
            "()L" + ASMHelper.periodToSlashes(cls.getName()) + ";",
            null,
            null);
    mv.visitCode();
    String name = cls.getName().replace(".", "/");
    mv.visitTypeInsn(Opcodes.NEW, name);
    mv.visitInsn(Opcodes.DUP);
    StringBuilder paraString = new StringBuilder("(");

    for (Class<?> paraClass : contructor.getParameterTypes()) {
      mv.visitInsn(Opcodes.ACONST_NULL);
      paraString.append("Ljava/lang/Object;");
    }
    paraString.append(")V");

    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, name, "<init>", paraString.toString(), false);

    mv.visitInsn(Opcodes.ARETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    cw.visitEnd();
    Class<?> factoryClass = helper.loadClass(newClassName, cls, cw.toByteArray());
    try {
      return factoryClass.newInstance();
    } catch (Exception e) {
      // ignore
    }
    return null;
  }