docs: Object invokeOperation(Object implObject, Method method, Object[] args)
                      throws IllegalAccessException, IllegalArgumentException, InvocationTargetException,
                      SQLException {
          if (args == null || args.length == 0) {
              String methodName = method.getName();
              if (methodName.equals("getReturnResultSet"))
                  return getReturnResultSet(implObject, method);
              else if (methodName.equals("getSingletonResultSet"))
                  return getSingletonResultSet(implObject, method);
          } else if (args.length == 1) {
              String methodName = method.getName();
              if (methodName.equals("addBatch") && method.getParameterTypes()[0].getName().equals("com.ibm.db2.jcc.SQLJPreparedStatement"))
                  return addBatch(implObject, method, args);
              else if (methodName.equals("executeBatch"))
                  return executeBatch(implObject, method, args);
              else if (methodName.equals("setSection") && method.getParameterTypes()[0].getName().equals("com.ibm.db2.jcc.SQLJSection")) {
                  // Since we cache the SQLJ section, update our cached value whenever it is updated
                  this.sqljSection =  args[0];
              }
          }
          return super.invokeOperation(implObject, method, args);
      }