code: public static InsnList call(String internalClassName, MethodNode method, InsnList ... args) {
          Validate.notNull(internalClassName);
          Validate.notNull(method);
          Validate.notNull(args);
          Validate.noNullElements(args);
          
          
          InsnList ret = new InsnList();
          
          for (InsnList arg : args) {
              ret.add(arg);
          }
  
          Type[] argTypes = Type.getMethodType(method.desc).getArgumentTypes();
          
          if ((method.access & Opcodes.ACC_STATIC) == Opcodes.ACC_STATIC) {
              Validate.isTrue(argTypes.length == args.length);
              ret.add(new MethodInsnNode(Opcodes.INVOKESTATIC, internalClassName, method.name, method.desc,
                      false));
          } else if ((method.access & Opcodes.ACC_INTERFACE) == Opcodes.ACC_INTERFACE) {
              Validate.isTrue(argTypes.length + 1 == args.length);
              ret.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, internalClassName, method.name, method.desc,
                      true));
          } else {
              Validate.isTrue(argTypes.length + 1 == args.length);
              ret.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, internalClassName, method.name, method.desc,
                      false));
          }
          
          return ret;
      }
docs: Calls a method with a set of arguments. After execution the stack may have an extra item pushed on it: the object that was returned
  by this method (if any).
  @param internalClassName name of class that {@code method} belongs to (this is the internal Java name where dots are replaced with
  slashes)
  @param method method node that describes the method to call
  @param args method argument instruction lists -- each instruction list must leave one item on the stack of the type expected
  by the method (note that if this is a non-static method, the first argument must always evaluate to the "this" pointer/reference)
  @return instructions to invoke a method
  @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 method}