1.cglib
BeanGenerator beanGenerator = new BeanGenerator(); beanGenerator.addProperty("id", Long.class); beanGenerator.addProperty("username", String.class); Object obj = beanGenerator.create(); BeanMap beanMap = BeanMap.create(obj); BeanCopier copier = BeanCopier.create(User.class, obj.getClass(), false); User user = new User(); user.setId(1L); user.setUsername("name1"); user.setPassword("123"); copier.copy(user, obj, null); System.out.println(beanMap.get("username"));Class clazz = obj.getClass(); Method[] methods = clazz.getDeclaredMethods();for (int i = 0; i < methods.length; i++) { System.out.println(methods[i].getName()); } 输出结果: name1 getId getUsername setId setUsername
최종적으로 생성된 obj에는 id와 username이라는 두 가지 속성만 있는 것을 출력에서 볼 수 있습니다
2.org.apache.commons.beanutils
DynaProperty property = new DynaProperty("id", Long.class); DynaProperty property1 = new DynaProperty("username", String.class); BasicDynaClass basicDynaClass = new BasicDynaClass("user", null, new DynaProperty[]{property, property1}); BasicDynaBean basicDynaBean = new BasicDynaBean(basicDynaClass); User user = new User(); user.setId(1L); user.setUsername("name1"); user.setPassword("123"); BeanUtils.copyProperties(basicDynaBean, user);Map<String, Object> map = basicDynaBean.getMap(); Iterator<String> it = map.keySet().iterator();while (it.hasNext()) { String key = it.next(); System.out.println(key + ":" + map.get(key)); } 输入结果: id:1username:name1
BasicDynaBean과 BasicDynaClass의 관계 보기
DynaBean 소스 코드
public interface DynaBean { public boolean contains(String name, String key); public Object get(String name); public Object get(String name, int index); public Object get(String name, String key); public DynaClass getDynaClass(); public void remove(String name, String key); public void set(String name, Object value); public void set(String name, int index, Object value); public void set(String name, String key, Object value); }
주로 인터페이스 정의
BasicDynaBean이 어떻게 구현되었는지 살펴보겠습니다. public Object get(String name);
/** * Return the value of a simple property with the specified name. * * @param name Name of the property whose value is to be retrieved * @return The property's value * * @exception IllegalArgumentException if there is no property * of the specified name */public Object get(String name) { // Return any non-null value for the specified property Object value = values.get(name); if (value != null) { return (value); } // Return a null value for a non-primitive property Class<?> type = getDynaProperty(name).getType(); if (!type.isPrimitive()) { return (value); } // Manufacture default values for primitive properties if (type == Boolean.TYPE) { return (Boolean.FALSE); } else if (type == Byte.TYPE) { return (new Byte((byte) 0)); } else if (type == Character.TYPE) { return (new Character((char) 0)); } else if (type == Double.TYPE) { return (new Double(0.0)); } else if (type == Float.TYPE) { return (new Float((float) 0.0)); } else if (type == Integer.TYPE) { return (new Integer(0)); } else if (type == Long.TYPE) { return (new Long(0)); } else if (type == Short.TYPE) { return (new Short((short) 0)); } else { return (null); } }
위 코드에서 값을 value로 얻는 것을 볼 수 있습니다.
/** * The set of property values for this DynaBean, keyed by property name. */ protected HashMap<String, Object> values = new HashMap<String, Object>();
실제로는 HashMap을 이용하여 구현합니다.
3.요약
obj에 getUsername 메소드가 있음에도 불구하고 cglib을 사용하여 동적으로 속성을 삭제하고 추가하는 경우, obj.getUsername() 호출만큼 직접적일 수는 없으며, username 값은 beanMap.get("username")을 통해서만 얻을 수 있습니다.
org.apache.commons.beanutils는 다음에서 HashMap을 사용하여 구현됩니다.
two 운영 측면에서 이 방법은 Map을 사용하는 것과 크게 다르지 않습니다. 다만 둘 다 속성을 복사하는 도구 방법을 제공한다는 점만 다를 뿐입니다.