@Override public void invoke(final MethodInvocation invocation) {
				try {
					final Class<?> clazz = Class.forName(invocation.clazz);
					final Constructor<?> constructor = clazz.getDeclaredConstructors()[0];
					constructor.setAccessible(true);
					final Object[] args = invocation.args;
					final Class<?>[] arg_types = constructor.getParameterTypes();
					for (int i = 0; i < arg_types.length; i ++) if (arg_types[i] == Context.class) args[i] = MethodShuttleService.this;	// Fill in context
					final Object instance = constructor.newInstance(args);
					if (instance instanceof GeneralContextRunnable)
						((GeneralContextRunnable) instance).run(MethodShuttleService.this);
					else if (instance instanceof GeneralContextFunction)
						invocation.result = ((GeneralContextFunction) instance).apply(MethodShuttleService.this);
					else if (instance instanceof GeneralVoidMethod)
						((GeneralVoidMethod) instance).invoke();
					else if (instance instanceof GeneralMethod)
						invocation.result = ((GeneralMethod) instance).invoke();
					else throw new IllegalArgumentException("Internal error: method mismatch");
				} catch (Throwable t) {
					if (t instanceof InvocationTargetException) t = ((InvocationTargetException) t).getTargetException();
					invocation.throwable = t;
					Log.w(TAG, "Error executing " + invocation.clazz, t);
				}
			}
@param lambda should be a lambda function with return value of type <code>R</code>.
               Context (but not its derivation) and types acceptable by {@link Parcel#writeValue(Object)} can be carried.
shared/src/main/java/com/oasisfeng/island/shuttle/MethodShuttle.java