docs: public void preInvokeForLifecycleInterceptors(LifecycleInterceptorWrapper wrapper,
                                                    int methodId,
                                                    EJSDeployedSupport s,
                                                    BeanO beanO) throws RemoteException {
          // NOTE: The implementation of this method is structured after preInvoke.
          // For a detailed explanation of the operations here, see the comments in
          // that method.
  
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
  
          EJBThreadData threadData = s.ivThreadData; // d630940
          EJBMethodInfoImpl methodInfo = mapMethodInfo(s, wrapper, methodId, null);
  
          if (isTraceOn) {
              if (tc.isEntryEnabled())
                  Tr.entry(tc, "preInvokeForLifecycleInterceptors(" + methodId + ":" +
                               methodInfo.getMethodName() + ")");
  
              if (tcClntInfo.isDebugEnabled())
                  Tr.debug(tcClntInfo, "preInvoke(" + methodInfo.getMethodName() + ")");
          }
  
          BeanMetaData bmd = wrapper.bmd;
  
          s.methodInfo = methodInfo;
          s.ivCallerContext = threadData.pushMethodContext(s); // d646139.1
          threadData.ivComponentMetaDataContext.beginContext(bmd); // d578360, d646139.1, RTC102449
  
          // d578360 - Normally, updateCallbackBeanO would be called via
          // EJSHome.createBeanO or ActivationStrategy.atActivate (for cached
          // instances), but we skipped that step since we started with the
          // BeanO, which is unlike the other pre/postInvoke.
          threadData.pushCallbackBeanO(beanO); // d630940
          s.beanO = beanO;
          s.ivPopCallbackBeanORequired = true; // RTC112628
  
          // d598062 - Always set context class loader for lifecycle methods.
          s.oldClassLoader = EJBThreadData.svThreadContextAccessor.pushContextClassLoaderForUnprivileged(bmd.ivContextClassLoader); // F85059
  
          try {
              // Set up transaction context
              s.uowCookie = uowCtrl.preInvoke(wrapper.beanId, methodInfo);
              s.uowCtrlPreInvoked = true;
              s.currentTx = getCurrentTx(s.uowCookie.getTransactionalUOW(), false);
              s.currentTx.preInvoke(s);
              s.currentIsolationLevel = methodInfo.isolationAttr;
  
              // Set up security context
              EJBSecurityCollaborator<?> securityCollaborator = ivSecurityCollaborator;
              if (securityCollaborator != null) {
                  s.securityCookie = notifySecurityCollaboratorPreInvoke(securityCollaborator, s);
                  s.ivSecurityCollaborator = securityCollaborator;
              }
  
              if (isTraceOn) {
                  if (tc.isEntryEnabled()) {
                      ContainerTx containerTx = s.currentTx;
                      Tr.exit(tc, "preInvokeForLifecycleInterceptors(" + methodId + ":" +
                                  methodInfo.getMethodName() + ") " +
                                  " Invoking method '" + methodInfo.getMethodName() +
                                  "' on bean '" + wrapper.getClass().getName() +
                                  "(" + wrapper.beanId + ")" +
                                  "', '" + containerTx + "', isGlobalTx=" +
                                  (containerTx != null ? (containerTx.isTransactionGlobal() ? "true" : "false") : "Unknown"));
                  }
  
                  if (TEEJBInvocationInfo.isTraceEnabled())
                      TEEJBInvocationInfo.tracePreInvokeEnds(s, wrapper);
              }
          } catch (Throwable t) {
              preinvokeHandleException(t, wrapper, methodId, s, methodInfo);
          }
      }