JAVA“動態”為類添加屬性

來源:互聯網
上載者:User

標籤:node   ons   nod   ogg   int   foreach   over   object   create   

部分參考:http://www.cnblogs.com/zy2009/p/6725843.html

pom.xml中添加:

<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.3</version></dependency><dependency><groupId>cglib</groupId><artifactId>cglib-nodep</artifactId><version>3.2.4</version></dependency>

  

使用cglib動態產生類代碼:

package com.frinder.util;import net.sf.cglib.beans.BeanGenerator;import net.sf.cglib.beans.BeanMap;import java.util.Map;/** * Created by frinder on 2017/7/18. */public class DynamicBean {    /**     * 目標對象     */    private Object target;    /**     * 屬性集合     */    private BeanMap beanMap;    public DynamicBean() {    }    public DynamicBean(Map<String, Class> propertyMap) {        this.target = generateBean(propertyMap);        this.beanMap = BeanMap.create(this.target);    }    /**     * bean 添加屬性和值     *     * @param property     * @param value     */    public void setValue(String property, Object value) {        beanMap.put(property, value);    }    /**     * 擷取屬性值     *     * @param property     * @return     */    public Object getValue(String property) {        return beanMap.get(property);    }    /**     * 擷取對象     *     * @return     */    public Object getTarget() {        return target;    }    /**     * 根據屬性產生對象     *     * @param propertyMap     * @return     */    private Object generateBean(Map<String, Class> propertyMap) {        BeanGenerator generator = new BeanGenerator();        propertyMap.forEach((k, v) -> generator.addProperty(k, v));        return generator.create();    }}

  

 

使用 commons-beanutils擷取來源物件屬性-類型集合,封裝成新對象並設定值代碼:

package com.frinder.util;import com.kiktech.entity.LoggerEntity;import net.logstash.logback.encoder.org.apache.commons.lang.builder.ReflectionToStringBuilder;import org.apache.commons.beanutils.PropertyUtilsBean;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.beans.PropertyDescriptor;import java.util.HashMap;import java.util.Map;/** * Created by frinder on 2017/7/18. */public class ReflectUtil {    static Logger logger = LoggerFactory.getLogger(ReflectUtil.class);    public static DynamicBean getTarget(Object target, Map<String, Object> addProperties) {        // get property map        PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();        PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(target);        Map<String, Class> propertyMap = new HashMap();        for (PropertyDescriptor d : descriptors) {            if (!"class".equalsIgnoreCase(d.getName())) {                propertyMap.put(d.getName(), d.getPropertyType());            }        }        // add extra properties        addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass()));        // new dynamic bean        DynamicBean dynamicBean = new DynamicBean(propertyMap);        // add old value        propertyMap.forEach((k, v) -> {            try {                dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(target, k));            } catch (Exception e) {                logger.error(e.getMessage(), e);            }        });        // add extra value        addProperties.forEach((k, v) -> dynamicBean.setValue(k, v));        return dynamicBean;    }    public static void main(String[] args) {        LoggerEntity entity = new LoggerEntity();        entity.setAppName("appname");        entity.setOperator("add");        entity.setResult("result");        entity.setUri("uri");        entity.setMethod("method");        Map<String, Object> addProperties = new HashMap() {{            put("hello", "world");            put("abc", "123");        }};        System.out.println(ReflectionToStringBuilder.toString(getTarget(entity, addProperties)));    }}

  

 LoggerEntity代碼:

package com.frinder.entity;import net.logstash.logback.encoder.org.apache.commons.lang.builder.ReflectionToStringBuilder;/** * Created by frinder on 2017/5/24. */public class LoggerEntity {    private String method;    private String uri;    private Object[] args;    private Object result;    private String operator;    private String appName;    /**     * 擷取當前對象     *     * @param method     * @param uri     * @param args     * @param result     * @return     */    public LoggerEntity get(String method, String uri, Object[] args, Object result, String operator, String appName) {        setMethod(method);        setUri(uri);        setArgs(args);        setResult(result);        setOperator(operator);        setAppName(appName);        return this;    }    public String getMethod() {        return method;    }    public void setMethod(String method) {        this.method = method;    }    public String getUri() {        return uri;    }    public void setUri(String uri) {        this.uri = uri;    }    public Object[] getArgs() {        return args;    }    public void setArgs(Object[] args) {        this.args = args;    }    public Object getResult() {        return result;    }    public void setResult(Object result) {        this.result = result;    }    public String getOperator() {        return operator;    }    public void setOperator(String operator) {        this.operator = operator;    }    public String getAppName() {        return appName;    }    public void setAppName(String appName) {        this.appName = appName;    }    @Override    public String toString() {        return ReflectionToStringBuilder.toString(this);    }}

  

 

測試結果:

 

JAVA“動態”為類添加屬性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.