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;
    }
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
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 .