[
https://issues.apache.org/jira/browse/JEXL-40?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12731692#action_12731692
]
Rahul Akolkar commented on JEXL-40:
-----------------------------------
I believe this is included in the patch on JEXL-58. Please let me know if this
is not the case.
> 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.