cglib/src/main/java/net/sf/cglib/proxy/MethodProxy.java
public Object invoke(Object obj, Object[] args) throws Throwable {
        try {
            init();
            FastClassInfo fci = fastClassInfo;
            return fci.f1.invoke(fci.i1, obj, args);
        } catch (InvocationTargetException e) {
            throw e.getTargetException();
        } catch (IllegalArgumentException e) {
            if (fastClassInfo.i1 < 0)
                throw new IllegalArgumentException("Protected method: " + sig1);
            throw e;
        }
    }
public Object invoke(Object obj, Object[] args) throws Throwable {
        try {
            init();
            FastClassInfo fci = fastClassInfo;
            return fci.f1.invoke(fci.i1, obj, args);
        } catch (InvocationTargetException e) {
            throw e.getTargetException();
        } catch (IllegalArgumentException e) {
            if (fastClassInfo.i1 < 0)
                throw new IllegalArgumentException("Protected method: " + sig1);
            throw e;
        }
    }
Invoke the original method, on a different object of the same type.
@param obj the compatible object; recursion will result if you use the object passed as the first
argument to the MethodInterceptor (usually not what you want)
@param args the arguments passed to the intercepted method; you may substitute a different
argument array as long as the types are compatible
@see MethodInterceptor#intercept
@throws Throwable the bare exceptions thrown by the called method are passed through
without wrapping in an <code>InvocationTargetException</code>