[ 
https://issues.apache.org/jira/browse/JEXL-40?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Henri Biestro updated JEXL-40:
------------------------------

    Attachment: JEXL-40.patch

Attached a patch for 
src/java/org/apache/commons/jexl/util/introspection/ClassMap.java applicable to 
the 2.0 trunk.
The code has been extracted from the Velocity trunk (778038) and fixes the 
problem.

> 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
>         Attachments: JEXL-40.patch
>
>
> 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.

Reply via email to