>Java >java지도 시간 >JavaBean은 속성을 동적으로 추가하고 삭제합니다.

JavaBean은 속성을 동적으로 추가하고 삭제합니다.

高洛峰
高洛峰원래의
2016-11-22 14:36:423499검색

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의 관계 보기

JavaBean은 속성을 동적으로 추가하고 삭제합니다.

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&#39;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을 사용하는 것과 크게 다르지 않습니다. 다만 둘 다 속성을 복사하는 도구 방법을 제공한다는 점만 다를 뿐입니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.