code: @Override
      public Object invoke(Object self, Method method, Method proceed, Object[] args) throws Throwable {
          if ("destroy".equals(method.getName()) && Marker.isMarker(0, method, args)) {
              if (bean.getEjbDescriptor().isStateful()) {
                  if (!reference.isRemoved()) {
                      reference.remove();
                  }
              }
              return null;
          }
  
          if (!bean.isClientCanCallRemoveMethods() && isRemoveMethod(method)) {
              throw BeanLogger.LOG.invalidRemoveMethodInvocation(method);
          }
          Class<?> businessInterface = getBusinessInterface(method);
          if (reference.isRemoved() && isToStringMethod(method)) {
              return businessInterface.getName() + " [REMOVED]";
          }
          Object proxiedInstance = reference.getBusinessObject(businessInterface);
  
          if (!Modifier.isPublic(method.getModifiers())) {
              throw new EJBException("Not a business method " + method.toString() +". Do not call non-public methods on EJB's.");
          }
          Object returnValue = Reflections.invokeAndUnwrap(proxiedInstance, method, args);
          BeanLogger.LOG.callProxiedMethod(method, proxiedInstance, args, returnValue);
          return returnValue;
      }
docs: Looks up the EJB in the container and executes the method on it
  
  @param self    the proxy instance.
  @param method  the overridden method declared in the super class or
  interface.
  @param proceed the forwarder method for invoking the overridden method. It
  is null if the overridden method is abstract or declared in the
  interface.
  @param args    an array of objects containing the values of the arguments
  passed in the method invocation on the proxy instance. If a
  parameter type is a primitive type, the type of the array
  element is a wrapper class.
  @return the resulting value of the method invocation.
  @throws Throwable if the method invocation fails.