src/main/java/org/vibur/dbcp/proxy/AbstractInvocationHandler.java
Object unrestrictedInvoke(T proxy, Method method, Object[] args) throws SQLException {
        String methodName = method.getName();

        if (methodName == "equals") { // comparing with == as the Method names are interned Strings
            return proxy == args[0];
        }
        if (methodName == "hashCode") {
            return System.identityHashCode(proxy);
        }
        if (methodName == "toString") {
            return "Vibur proxy for: " + target;
        }
        // getClass(), notify(), notifyAll(), and wait() method calls are not intercepted by the dynamic proxies

        if (methodName == "unwrap") {
            @SuppressWarnings("unchecked")
            Class<T> iface = (Class<T>) args[0];
            return unwrap(iface);
        }
        if (methodName == "isWrapperFor") {
            return isWrapperFor((Class<?>) args[0]);
        }

        return NO_RESULT;
    }
Object unrestrictedInvoke(T proxy, Method method, Object[] args) throws SQLException {
        String methodName = method.getName();

        if (methodName == "equals") { // comparing with == as the Method names are interned Strings
            return proxy == args[0];
        }
        if (methodName == "hashCode") {
            return System.identityHashCode(proxy);
        }
        if (methodName == "toString") {
            return "Vibur proxy for: " + target;
        }
        // getClass(), notify(), notifyAll(), and wait() method calls are not intercepted by the dynamic proxies

        if (methodName == "unwrap") {
            @SuppressWarnings("unchecked")
            Class<T> iface = (Class<T>) args[0];
            return unwrap(iface);
        }
        if (methodName == "isWrapperFor") {
            return isWrapperFor((Class<?>) args[0]);
        }

        return NO_RESULT;
    }
Handles all unrestricted method invocations that we can process before passing through the
{@link #restrictedAccessEntry}. This method will be overridden in the {@code AbstractInvocationHandler}
subclasses, and will be the place to implement the specific to these subclasses logic for unrestricted method
invocations handling. When the invoked {@code method} is not an unrestricted method the default implementation
returns {@link #NO_RESULT} to indicate this.

@param proxy see {@link java.lang.reflect.InvocationHandler#invoke}
@param method as above
@param args as above
@return as above
@throws SQLException if the invoked underlying method throws such