src/main/java/js/container/ManagedProxyHandler.java
@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		final ManagedMethodSPI managedMethod = managedClass.getManagedMethod(method);
		log.trace("Invoke |%s|.", managedMethod);

		if (!managedMethod.isTransactional()) {
			// execute managed method that is not included within transactional boundaries
			try {
				return managedMethod.invoke(managedInstance, args);
			} catch (Throwable t) {
				throw throwable(t, "Non transactional method |%s| invocation fails.", managedMethod);
			}
		}

		if (managedMethod.isImmutable()) {
			return executeImmutableTransaction(managedMethod, args);
		}
		return executeMutableTransaction(managedMethod, args);
	}
@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		final ManagedMethodSPI managedMethod = managedClass.getManagedMethod(method);
		log.trace("Invoke |%s|.", managedMethod);

		if (!managedMethod.isTransactional()) {
			// execute managed method that is not included within transactional boundaries
			try {
				return managedMethod.invoke(managedInstance, args);
			} catch (Throwable t) {
				throw throwable(t, "Non transactional method |%s| invocation fails.", managedMethod);
			}
		}

		if (managedMethod.isImmutable()) {
			return executeImmutableTransaction(managedMethod, args);
		}
		return executeMutableTransaction(managedMethod, args);
	}
Invocation handler implementation. Every method invocation on managed class interface is routed to this point. Here
actual container services are implemented and method is invoked against wrapped instance.

@param proxy instance of dynamically generated Java Proxy,
@param method interface Java method about to invoke,
@param args method invocation arguments.
@return value returned by implementation method.
@throws Throwable forward any exception rose by implementation method.