ReflectiveMethodResolver lets local static methods override java.lang.Class methods
Issue: SPR-13918
This commit is contained in:
		
							parent
							
								
									903ae48382
								
							
						
					
					
						commit
						43bcab9c1a
					
				| 
						 | 
				
			
			@ -221,14 +221,15 @@ public class ReflectiveMethodResolver implements MethodResolver {
 | 
			
		|||
	private Collection<Method> getMethods(Class<?> type, Object targetObject) {
 | 
			
		||||
		if (targetObject instanceof Class) {
 | 
			
		||||
			Set<Method> result = new LinkedHashSet<Method>();
 | 
			
		||||
			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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			@ -2080,6 +2082,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;
 | 
			
		||||
| 
						 | 
				
			
			@ -2093,6 +2106,7 @@ public class SpelReproTests extends AbstractExpressionTests {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	public static class BeanClass {
 | 
			
		||||
 | 
			
		||||
		private final List<ListOf> list;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue