docs: @Override
      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          // Skip common methods like toString and hashCode
  
          String methName = method.getName();
          if (METHODS_TO_SKIP.contains(methName)) {
              try {
                  return method.invoke(impl, args);
              } catch (InvocationTargetException x) {// No FFDC coded needed.
                  throw x.getCause();
              }
          }
  
          Object result;
          Object traceableResult = null;
  
          // Trace entry
  
          if (TraceComponent.isAnyTracingEnabled() && tracer.isDebugEnabled()) {
              boolean hasPassword = methName.equals("getPooledConnection") || methName.equals("getXAConnection") || methName.equals("connect");
  
              StringBuilder buffer = new StringBuilder(120);
  
              buffer.append("==> ").append(traceID).append('.').append(methName).append('(');
  
              if (tracer.getLevel() <= 1 /* LevelConstants.LEVEL_ALL */&& args != null)
                  for (int i = 0; i < args.length; i++) {
                      if(methName.equals("connect") && i == 0) {
                          buffer.append(PropertyService.filterURL(toString(args[i])));
                          continue;
                      }
                      
                      if (i != 0)
                          buffer.append(", ");
                      buffer.append(hasPassword && i == 1 ? "***" : toString(args[i]));
                  }
  
              buffer.append(");");
  
              // SQL for PreparedStatement & CallableStatement
              if (sql != null && methName.startsWith("execute"))
                  buffer.append(" // ").append(sql);
  
              writer.println(new String(buffer));
          }
  
          // Perform the operation
  
          try {
              result = method.invoke(impl, args);
          } catch (InvocationTargetException x) {
              // No FFDC code needed. Trace exit for failed invocation.
  
              if (TraceComponent.isAnyTracingEnabled() && tracer.isDebugEnabled()) 
              {
                  StringBuilder buffer = new StringBuilder(800);
                  buffer.append("<== ").append(toString(x.getCause()));
                  writer.println(new String(buffer));
              }
  
              throw x.getCause();
          }
  
          // If the result is a JDBC API or a result of unwrap, it should be made traceable.
  
          boolean isUnwrap = methName.equals("unwrap");
  
          if (result != null && (isUnwrap || TRACEABLE_TYPES.contains(method.getReturnType()))) { 
              final Class<?> returnType = isUnwrap ? (Class<?>) args[0] : method.getReturnType();
  
              // - include SQL for PreparedStatement & CallableStatement
              final String query = methName.startsWith("prepare") && PreparedStatement.class.isAssignableFrom(returnType)
                             && args.length >= 1 && args[0] instanceof String ? (String) args[0] : null;
              final WSJdbcTracer newTracer = new WSJdbcTracer(tracer, writer, result, returnType, query, false);
              traceableResult = AccessController.doPrivileged(new PrivilegedAction<Object>() {
                  public Object run() {
                      return Proxy.newProxyInstance(returnType.getClassLoader(), new Class[] { returnType }, newTracer);
                  }
              });
          }
  
          // Trace exit after successful invocation.
  
          if (TraceComponent.isAnyTracingEnabled() && tracer.isDebugEnabled()) {
              StringBuilder buffer = new StringBuilder(40);
              buffer.append("<== ");
  
              if (void.class.equals(method.getReturnType())) {
                  buffer.append(methName);
              }
              else {
                  if (traceableResult != null)
                      buffer.append(method.getReturnType().getSimpleName())
                                      .append(Integer.toHexString(System.identityHashCode(result)));
  
                  else if (tracer.getLevel() <= 1 /* LevelConstants.LEVEL_ALL */)
                      buffer.append(toString(result));
              }
  
              writer.println(new String(buffer));
          }
  
          return traceableResult == null ? result : traceableResult;
      }