private String[] getParameterNames(Method method) {
		if (logInterface.getAnnotation(PreserveParameterNames.class) != null) {
			try {
				Class<?> holderClass = Class.forName(
						logInterface.getName() + PreserveParameterNames.PARAMETER_NAME_HOLDER_SUFFIX,
						true,
						logInterface.getClassLoader()
				);
				Field holderField = holderClass.getDeclaredField(method.getName());
				Object names = holderField.get(null);
				return (String[]) names;
			} catch (ClassNotFoundException | LinkageError |
					NoSuchFieldException | IllegalAccessException |
					IllegalArgumentException | NullPointerException | ClassCastException ignore) {
				// fall back on runtime parameter name detection
			}
		}
		Parameter[] parameters = method.getParameters();
		String[] names = new String[parameters.length];
		for (int i = 0; i < parameters.length; ++i) {
			names[i] = parameters[i].getName();
		}
		return names;
	}