code: protected void preInvoke(Method m, Object [] args, String [] interceptorNames)
          throws InterceptorPivotException
      {
          //
          // If the implementation expects single threaded behavior and our container does
          // not guarantee it, then enforce it locally here
          //
          if (_invokeLock != null)
          {
              try { _invokeLock.acquire(); } catch (InterruptedException ie) { }
          }
  
          //
          // Process interceptors
          //
          if ( interceptorNames != null )
          {
              for ( String n : interceptorNames )
              {
                  Interceptor i = ensureInterceptor( n );
                  try
                  {
                      i.preInvoke( this, m, args );
                  }
                  catch (InterceptorPivotException ipe)
                  {
                      ipe.setInterceptorName(n);
                      throw ipe;
                  }
              }
          }
  
          Vector<InvokeListener> invokeListeners = getInvokeListeners();
          if (invokeListeners.size() > 0)
          {
              for (InvokeListener listener : invokeListeners)
                  listener.preInvoke(m, args);
          }
      }
docs: The preinvoke method is called before all operations on the control.  In addition to
  providing a basic hook for logging, context initialization, resource management,
  and other common services, it also provides a hook for interceptors.