JEXL fails to find abstract public methods in the base class if overridden by non-public derived types ------------------------------------------------------------------------------------------------------
Key: JEXL-40 URL: https://issues.apache.org/jira/browse/JEXL-40 Project: Commons JEXL Issue Type: Bug Affects Versions: 1.1 Reporter: Kohsuke Kawaguchi If I have a code that fits the following pattern: {noformat} public class Base { public abstract void foo(); } class Derived extends Base { public void foo() {} } {noformat} JEXL fails to discover the foo method on an instance of Derived, even if this method is invokable. This is because in ClassMap.java, the populateMethodCache method reads: {noformat} // Some of the interfaces contain abstract methods. That is fine, because the actual object must // implement them anyway (else it wouldn't be implementing the interface). If we find an abstract // method in a non-interface, we skip it, because we do want to make sure that no abstract methods end up in // the cache. if (classToReflect.isInterface() || !Modifier.isAbstract(modifiers)) { {noformat} The problem can be fixed by simply getting rid this check and always do "methodCache.put(methods[i]);" The comment above doesn't make much sense to me. First, interfaces only contain abstract methods by definition. And if interfaces are deemed OK, I don't see why abstract methods in the base classes are treated any differently. Given any instance that's assignable to the base type, under normal circumstances every abstract method is invokable. There's no difference between interfaces and base classes on this point. (The only situation where abstract methods are not implemented is when class files were changed in incompatible way) This pattern of having abstract methods in the base type to be implemented by non-public class is a common pattern. So I suggest we simply remove the if block shown above. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.