PropertyEditorRegistrySupport.java : private void createDefaultEditors()

Language/JAVA 2015. 1. 9. 14:45

private void createDefaultEditors() { this.defaultEditors = new HashMap<Class<?>, PropertyEditor>(64); // Simple editors, without parameterization capabilities. // The JDK does not contain a default editor for any of these target types. this.defaultEditors.put(Charset.class, new CharsetEditor()); this.defaultEditors.put(Class.class, new ClassEditor()); this.defaultEditors.put(Class[].class, new ClassArrayEditor()); this.defaultEditors.put(Currency.class, new CurrencyEditor()); this.defaultEditors.put(File.class, new FileEditor()); this.defaultEditors.put(InputStream.class, new InputStreamEditor()); this.defaultEditors.put(InputSource.class, new InputSourceEditor()); this.defaultEditors.put(Locale.class, new LocaleEditor()); this.defaultEditors.put(Pattern.class, new PatternEditor()); this.defaultEditors.put(Properties.class, new PropertiesEditor()); this.defaultEditors.put(Resource[].class, new ResourceArrayPropertyEditor()); this.defaultEditors.put(TimeZone.class, new TimeZoneEditor()); this.defaultEditors.put(URI.class, new URIEditor()); this.defaultEditors.put(URL.class, new URLEditor()); this.defaultEditors.put(UUID.class, new UUIDEditor()); // Default instances of collection editors. // Can be overridden by registering custom instances of those as custom editors. this.defaultEditors.put(Collection.class, new CustomCollectionEditor(Collection.class)); this.defaultEditors.put(Set.class, new CustomCollectionEditor(Set.class)); this.defaultEditors.put(SortedSet.class, new CustomCollectionEditor(SortedSet.class)); this.defaultEditors.put(List.class, new CustomCollectionEditor(List.class)); this.defaultEditors.put(SortedMap.class, new CustomMapEditor(SortedMap.class)); // Default editors for primitive arrays. this.defaultEditors.put(byte[].class, new ByteArrayPropertyEditor()); this.defaultEditors.put(char[].class, new CharArrayPropertyEditor()); // The JDK does not contain a default editor for char! this.defaultEditors.put(char.class, new CharacterEditor(false)); this.defaultEditors.put(Character.class, new CharacterEditor(true)); // Spring's CustomBooleanEditor accepts more flag values than the JDK's default editor. this.defaultEditors.put(boolean.class, new CustomBooleanEditor(false)); this.defaultEditors.put(Boolean.class, new CustomBooleanEditor(true)); // The JDK does not contain default editors for number wrapper types! // Override JDK primitive number editors with our own CustomNumberEditor. this.defaultEditors.put(byte.class, new CustomNumberEditor(Byte.class, false)); this.defaultEditors.put(Byte.class, new CustomNumberEditor(Byte.class, true)); this.defaultEditors.put(short.class, new CustomNumberEditor(Short.class, false)); this.defaultEditors.put(Short.class, new CustomNumberEditor(Short.class, true)); this.defaultEditors.put(int.class, new CustomNumberEditor(Integer.class, false)); this.defaultEditors.put(Integer.class, new CustomNumberEditor(Integer.class, true)); this.defaultEditors.put(long.class, new CustomNumberEditor(Long.class, false)); this.defaultEditors.put(Long.class, new CustomNumberEditor(Long.class, true)); this.defaultEditors.put(float.class, new CustomNumberEditor(Float.class, false)); this.defaultEditors.put(Float.class, new CustomNumberEditor(Float.class, true)); this.defaultEditors.put(double.class, new CustomNumberEditor(Double.class, false)); this.defaultEditors.put(Double.class, new CustomNumberEditor(Double.class, true)); this.defaultEditors.put(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, true)); this.defaultEditors.put(BigInteger.class, new CustomNumberEditor(BigInteger.class, true)); // Only register config value editors if explicitly requested. if (this.configValueEditorsActive) { StringArrayPropertyEditor sae = new StringArrayPropertyEditor(); this.defaultEditors.put(String[].class, sae); this.defaultEditors.put(short[].class, sae); this.defaultEditors.put(int[].class, sae); this.defaultEditors.put(long[].class, sae); } }




응용 



package net.slipp.web; import java.beans.PropertyEditor; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.propertyeditors.CustomBooleanEditor; import org.springframework.beans.propertyeditors.CustomNumberEditor; import org.springframework.mock.web.MockHttpServletRequest; public class ReflectionTest { private static Logger log = LoggerFactory.getLogger(ReflectionTest.class); @SuppressWarnings("serial") private static Map<Class<?>, PropertyEditor> defaultEditors = new HashMap<Class<?>, PropertyEditor>() { { put(boolean.class, new CustomBooleanEditor(false)); put(Boolean.class, new CustomBooleanEditor(true)); put(byte.class, new CustomNumberEditor(Byte.class, false)); put(Byte.class, new CustomNumberEditor(Byte.class, true)); put(int.class, new CustomNumberEditor(Integer.class, false)); put(Integer.class, new CustomNumberEditor(Integer.class, true)); put(long.class, new CustomNumberEditor(Long.class, false)); put(Long.class, new CustomNumberEditor(Long.class, true)); } }; @Test public void populateFromRequestToUser() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter("userId", "test"); request.addParameter("name", "슬립"); request.addParameter("userNo", "12356"); request.addParameter("age", "35"); MockUser user = new MockUser(); Field[] fields = MockUser.class.getDeclaredFields(); for (Field field : fields) { log.debug("field name : {}", field.getName()); field.setAccessible(true); String value = request.getParameter(field.getName()); if (field.getType() == String.class) { field.set(user, value); continue; } PropertyEditor propertyEditor = defaultEditors.get(field.getType()); if (propertyEditor != null) { propertyEditor.setAsText(value); field.set(user, propertyEditor.getValue()); } } log.debug("User : {}", user); } private class MockUser { private long userNo; private Integer age; private String userId; private String name; @Override public String toString() { return "MockUser [userNo=" + userNo + ", age=" + age + ", userId=" + userId + ", name=" + name + "]"; } } }



출처 http://slipp.net/questions/85


'Language > JAVA' 카테고리의 다른 글

java class loader #1  (1) 2016.08.04
[Java] ClassLoader API  (0) 2016.08.04
Java Reflection - Dynamic Class Loading and Reloading  (0) 2014.12.01
Java Reflection - Dynamic Proxies  (0) 2014.12.01
Java Reflection - Arrays  (0) 2014.12.01
: