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); + } } } }