You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2018/01/21 10:41:04 UTC

svn commit: r1821780 - /commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java

Author: henrib
Date: Sun Jan 21 10:41:04 2018
New Revision: 1821780

URL: http://svn.apache.org/viewvc?rev=1821780&view=rev
Log:
JEXL-246:
Improved detection of operator methods that arent overrides

Modified:
    commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java

Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java?rev=1821780&r1=1821779&r2=1821780&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java (original)
+++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl3/internal/introspection/Uberspect.java Sun Jan 21 10:41:04 2018
@@ -428,17 +428,24 @@ public class Uberspect implements JexlUb
             Set<JexlOperator> ops = operatorMap.get(aclass);
             if (ops == null) {
                 ops = EnumSet.noneOf(JexlOperator.class);
-                for (JexlOperator op : JexlOperator.values()) {
-                    Method[] methods = getMethods(arithmetic.getClass(), op.getMethodName());
-                    if (methods != null) {
-                        mloop: for (Method method : methods) {
-                            Class<?>[] parms = method.getParameterTypes();
-                            if (parms.length != op.getArity()) {
-                                continue;
-                            }
-                            // eliminate method(Object) and method(Object, Object)
-                            if (!JexlArithmetic.class.equals(method.getDeclaringClass())) {
-                                ops.add(op);
+                // deal only with derived classes
+                if (!JexlArithmetic.class.equals(aclass)) {
+                    for (JexlOperator op : JexlOperator.values()) {
+                        Method[] methods = getMethods(arithmetic.getClass(), op.getMethodName());
+                        if (methods != null) {
+                            mloop:
+                            for (Method method : methods) {
+                                Class<?>[] parms = method.getParameterTypes();
+                                if (parms.length != op.getArity()) {
+                                    continue;
+                                }
+                                // keep only methods that are not overrides
+                                try {
+                                    JexlArithmetic.class.getMethod(method.getName(), method.getParameterTypes());
+                                } catch (NoSuchMethodException xmethod) {
+                                    // method was not found in JexlArithmetic; this is an operator definition
+                                    ops.add(op);
+                                }
                             }
                         }
                     }