From cf3e460a8be291af9fe09189c611bfb1fbb5843a Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 8 Feb 2016 13:23:02 +0100 Subject: [PATCH] ReflectiveMethodResolver lets local static methods override java.lang.Class methods Issue: SPR-13918 (cherry picked from commit 43bcab9) --- .../spel/support/ReflectiveMethodResolver.java | 5 +++-- .../expression/spel/SpelReproTests.java | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java index b78f66e9de1..ffd64c70604 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java @@ -221,14 +221,15 @@ public class ReflectiveMethodResolver implements MethodResolver { private Collection getMethods(Class type, Object targetObject) { if (targetObject instanceof Class) { Set result = new LinkedHashSet(); - result.addAll(Arrays.asList(getMethods(targetObject.getClass()))); - // Add these also so that static result are invocable on the type: e.g. Float.valueOf(..) + // Add these so that static methods are invocable on the type: e.g. Float.valueOf(..) Method[] methods = getMethods(type); for (Method method : methods) { if (Modifier.isStatic(method.getModifiers())) { result.add(method); } } + // Also expose methods from java.lang.Class itself + result.addAll(Arrays.asList(getMethods(Class.class))); return result; } else { diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java index b1743e50043..8fe757271f7 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/SpelReproTests.java @@ -19,6 +19,7 @@ package org.springframework.expression.spel; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -36,6 +37,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; + import org.springframework.core.MethodParameter; import org.springframework.core.convert.TypeDescriptor; import org.springframework.expression.AccessException; @@ -2051,6 +2053,17 @@ public class SpelReproTests extends AbstractExpressionTests { assertEquals("{X=66}", result.toString()); } + @Test + public void SPR13918() { + EvaluationContext context = new StandardEvaluationContext(); + context.setVariable("encoding", "UTF-8"); + + Expression ex = parser.parseExpression("T(java.nio.charset.Charset).forName(#encoding)"); + Object result = ex.getValue(context); + assertEquals(Charset.forName("UTF-8"), result); + } + + public static class ListOf { private final double value; @@ -2064,6 +2077,7 @@ public class SpelReproTests extends AbstractExpressionTests { } } + public static class BeanClass { private final List list;