hudson.Util.isOverridden doesn't work for protected methods

Details

Description

hudson.Util.isOverridden is used in Jenkins to test if a public method has been overridden in a base class.

In some cases it can be helpful to perform an analogous test against protected methods, for example when using the API/SPI model for an extension point, the public methods are intended to be used by consumers while the protected methods are intended to be implemented by implementers.

When the SPI is extended, for interoperability with older implementations it can be useful to check if the new SPI methods have been overridden from the new default implementation.

When an SPI method might cause a performance hit when overridden, it can be useful to check if the shortcut can be taken (where the method is not overridden) or whether the long path has to be taken (because the method has been overridden)

Note: For performance reasons, it may make sense to have this functionality in a separate method, e.g. hudson.Util.isProtectedOverridden or it may be that a consolidated single path is more performant. In either case there is a need for this.