@Override public Object invokeMethod(Object... args) { Class<?>[] parameterTypes = method.getParameterTypes(); Object[] invokeArgs; if (parameterTypes.length == 0) { invokeArgs = new Object[] {}; } else if (parameterTypes.length != args.length) { throw new IllegalArgumentException("Wrong number of arguments, expected no more than: [" + parameterTypes.length + "]"); } else { invokeArgs = args; } method.setAccessible(true); try { // Extract the target from an Advised as late as possible // in case it contains a lazy initialization Object target = extractTarget(object, method); return method.invoke(target, invokeArgs); } catch (Exception e) { throw new IllegalArgumentException("Unable to invoke method: [" + method + "] on object: [" + object + "] with arguments: [" + Arrays.toString(args) + "]", e); } }
private Object extractTarget(Object target, Method method) { if (target instanceof Advised) { Object source; try { source = ((Advised) target).getTargetSource().getTarget(); } catch (Exception e) { throw new IllegalStateException("Could not extract target from proxy", e); } if (source instanceof Advised) { source = extractTarget(source, method); } if (method.getDeclaringClass().isAssignableFrom(source.getClass())) { target = source; } } return target; }
@Override public Object invokeMethod(Object... args) { Class<?>[] parameterTypes = method.getParameterTypes(); Object[] invokeArgs; if (parameterTypes.length == 0) { invokeArgs = new Object[] {}; } else if (parameterTypes.length != args.length) { throw new IllegalArgumentException("Wrong number of arguments, expected no more than: [" + parameterTypes.length + "]"); } else { invokeArgs = args; } method.setAccessible(true); try { // Extract the target from an Advised as late as possible // in case it contains a lazy initialization Object target = extractTarget(object, method); return method.invoke(target, invokeArgs); } catch (Exception e) { throw new IllegalArgumentException("Unable to invoke method: [" + method + "] on object: [" + object + "] with arguments: [" + Arrays.toString(args) + "]", e); } }
private Object extractTarget(Object target, Method method) { if (target instanceof Advised) { Object source; try { source = ((Advised) target).getTargetSource().getTarget(); } catch (Exception e) { throw new IllegalStateException("Could not extract target from proxy", e); } if (source instanceof Advised) { source = extractTarget(source, method); } if (method.getDeclaringClass().isAssignableFrom(source.getClass())) { target = source; } } return target; }