code: private Object addBatch(Object implObject, Method method, Object[] args)
                      throws IllegalAccessException, IllegalArgumentException, InvocationTargetException,
                      SQLException {
          Object sqljPstmt = args[0];
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled(); 
  
          if (isTraceOn && tc.isDebugEnabled()) Tr.debug(tc, "addBatch", new Object[] 
              { this, AdapterUtil.toString(sqljPstmt) });
  
          // Get underlying instance of SQLJPreparedStatement from dynamic proxy
          // to avoid java.lang.ClassCastException in addBatch()
          if (sqljPstmt != null && Proxy.isProxyClass(sqljPstmt.getClass())) {
              InvocationHandler handler = Proxy.getInvocationHandler(sqljPstmt);
              if (handler instanceof WSJdbcWrapper)
                  args = new Object[] { ((WSJdbcWrapper) handler).getJDBCImplObject() }; 
          }
  
          return method.invoke(implObject, args);
      }
docs: Invokes addBatch after replacing the parameter with the DB2 impl object if proxied.
  
  @param implObject the instance on which the operation is invoked.
  @param method the method that is invoked.
  @param args the parameters to the method.
  
  @throws IllegalAccessException if the method is inaccessible.
  @throws IllegalArgumentException if the instance does not have the method or
  if the method arguments are not appropriate.
  @throws InvocationTargetException if the method raises a checked exception.
  @throws SQLException if unable to invoke the method for other reasons.
  
  @return the result of invoking the method.