public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		try {
			if (method.getName().equalsIgnoreCase("setService")) {
				this.setService(args[0]);
				return null;
			} else if (method.getName().equalsIgnoreCase("unsetService")) {
				this.unsetService(args[0]);
				return null;
			}

			if (service == null && hasStartStop)
				throw new RuntimeException("need set real service first");

			if (method.getName().equalsIgnoreCase(startMethodName)
					|| method.getName().equalsIgnoreCase(stopMethodName))
			{
				return callStartOrStop(proxy, method, args);
			}
			else
				return method.invoke(service, args);

		} catch (Exception e) {
			throw new RuntimeException("error ", e);
		}

	}