java.lang.invoke.MethodHandleProxies.isSingleMethod(Class<?> intf) returns a boolean indicating whether the provided interface has only one defined method upon it.
When making this consideration, it tries not count any method defined on the interface that is also defined by java.lang.Object (and so will always be there for all implementations of the interface). Because of this, for example, isSingleMethod should return 'true' for java.util.Comparator, which has two defined methods - compare() and equals() - as all but one of these methods are also defined by java.lang.Object. isSingleMethod() makes the consideration my iterating through the array of Method objects returned from Class.getMethods(). The API javadoc for Class.getMethods() [1] says (amongst other things): "The elements in the array returned are not sorted and are not in any particular order." However, isSingleMethod() currently relies upon any methods defined on java.lang.Object appearing in the list before any others. I suppose this happens to be the case currently (at least, when using hotspot), but it is a generally brittle assumption for this code to rely upon. Please find below a suggested change which removes this assumption by making the algorithm agnostic to the ordering returned by Class.getMethods(). Please consider this change for committal. Thanks, Neil [1] http://download.oracle.com/javase/7/docs/api/java/lang/Class.html#getMethods%28%29 -- Unless stated above: IBM email: neil_richards at uk.ibm.com IBM United Kingdom Limited - Registered in England and Wales with number 741598. Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU # HG changeset patch # User Neil Richards <neil.richa...@ngmr.net>, <neil_richa...@uk.ibm.com> # Date 1311156497 -3600 # Branch ojdk-131 # Node ID 1062362b6e7a39d9bc3f468cfd33ae100371413e # Parent 8bbea505b060fc7c97d9c241f8531a2a758cbe20 Summary: Make isSingleMethod() agnostic of ordering of methods returned from Class.getMethods() Contributed-by: <neil.richa...@ngmr.net> diff -r 8bbea505b060 -r 1062362b6e7a src/share/classes/java/lang/invoke/MethodHandleProxies.java --- a/src/share/classes/java/lang/invoke/MethodHandleProxies.java Mon Jul 18 22:25:58 2011 +0100 +++ b/src/share/classes/java/lang/invoke/MethodHandleProxies.java Wed Jul 20 11:08:17 2011 +0100 @@ -246,8 +246,8 @@ Method sm = null; for (Method m : intfc.getMethods()) { int mod = m.getModifiers(); - if (Modifier.isAbstract(mod)) { - if (sm != null && !isObjectMethod(sm)) + if (Modifier.isAbstract(mod) && !isObjectMethod(m)) { + if (sm != null) return null; // too many abstract methods sm = m; }