code: public static InsnList construct(Constructor<?> constructor, InsnList ... args) {
          Validate.notNull(constructor);
          Validate.notNull(args);
          Validate.noNullElements(args);
          Validate.isTrue(constructor.getParameterCount() == args.length);
          
          
          InsnList ret = new InsnList();
          
          Type clsType = Type.getType(constructor.getDeclaringClass());
          Type methodType = Type.getType(constructor);
          
          ret.add(new TypeInsnNode(Opcodes.NEW, clsType.getInternalName()));
          ret.add(new InsnNode(Opcodes.DUP));
          for (InsnList arg : args) {
              ret.add(arg);
          }
          ret.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, clsType.getInternalName(), "<init>", methodType.getDescriptor(), false));
          
          return ret;
      }
docs: Calls a constructor with a set of arguments. After execution the stack should have an extra item pushed on it: the object that was
  created by this constructor.
  @param constructor constructor to call
  @param args constructor argument instruction lists -- each instruction list must leave one item on the stack of the type expected
  by the constructor
  @return instructions to invoke a constructor
  @throws NullPointerException if any argument is {@code null} or array contains {@code null}
  @throws IllegalArgumentException if the length of {@code args} doesn't match the number of parameters in {@code constructor}