精华内容
下载资源
问答
  • java动态给对象添加属性并赋值

    万次阅读 2019-04-18 22:00:43
    * @param addValMap 动态需要添加属性属性值 * @return 新的对象 * @throws Exception */ public Object dynamicClass(Object object,HashMap addMap, HashMap addValMap) throws Exception { HashMap ...

    最近工作中剥离通用功能比较多。

    Maven引用:

           <!-- https://mvnrepository.com/artifact/cglib/cglib -->
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>2.2.2</version>
            </dependency>

    不要引用太高级的版本。会存在兼容问题。本身有内部依赖。

    核心类:

    import net.sf.cglib.beans.*;
    
    import java.util.*;
    
    public class DynamicBean {
        private Object object = null; //动态生成的类
        private BeanMap beanMap = null; //存放属性名称以及属性的类型
    
        public DynamicBean() {
            super();
        }
    
        public DynamicBean(Map propertyMap) {
            this.object = generateBean(propertyMap);
            this.beanMap = BeanMap.create(this.object);
        }
    
        /**
         * @param propertyMap
         * @return
         */
        private Object generateBean(Map propertyMap) {
            BeanGenerator generator = new BeanGenerator();
            Set keySet = propertyMap.keySet();
            for (Iterator i = keySet.iterator(); i.hasNext(); ) {
                String key = (String) i.next();
                generator.addProperty(key, (Class) propertyMap.get(key));
            }
            return generator.create();
        }
    
        /**
         * 给bean属性赋值
         *
         * @param property 属性名
         * @param value    值
         */
        public void setValue(Object property, Object value) {
            beanMap.put(property, value);
        }
    
        /**
         * 通过属性名得到属性值
         *
         * @param property 属性名
         * @return 值
         */
        public Object getValue(String property) {
            return beanMap.get(property);
        }
    
        /**
         * 得到该实体bean对象
         *
         * @return
         */
        public Object getObject() {
            return this.object;
        }
    }

    帮助类:

    import java.beans.BeanInfo;
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Method;
    import java.util.*;
    
    public class ClassUtil {
    
        /**
         *
         * @param object   旧的对象带值
         * @param addMap   动态需要添加的属性和属性类型
         * @param addValMap  动态需要添加的属性和属性值
         * @return  新的对象
         * @throws Exception
         */
        public Object dynamicClass(Object object,HashMap addMap, HashMap addValMap) throws Exception {
            HashMap returnMap = new HashMap();
            HashMap typeMap = new HashMap();
    
    
            Class<?> type = object.getClass();
            BeanInfo beanInfo = Introspector.getBeanInfo(type);
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (int i = 0; i < propertyDescriptors.length; i++) {
                PropertyDescriptor descriptor = propertyDescriptors[i];
                String propertyName = descriptor.getName();
                if (!propertyName.equals("class")) {
                    Method readMethod = descriptor.getReadMethod();
                    Object result = readMethod.invoke(object);
                    //可以判断为 NULL不赋值
                    returnMap.put(propertyName, result);
                    typeMap.put(propertyName, descriptor.getPropertyType());
                }
            }
    
            returnMap.putAll(addValMap);
            typeMap.putAll(addMap);
            //map转换成实体对象
            DynamicBean bean = new DynamicBean(typeMap);
            //赋值
            Set keys = typeMap.keySet();
            for (Iterator it = keys.iterator(); it.hasNext(); ) {
                String key = (String) it.next();
                bean.setValue(key, returnMap.get(key));
            }
            Object obj = bean.getObject();
            return obj;
        }
    
    }
    

     

    使用:

            Order order = new Order();
            order.setId(1);
            order.setName("order1");
            List<OrderDetail> orderDetailList = new ArrayList<OrderDetail>();
    
            OrderDetail orderDetail = new OrderDetail();
            orderDetail.setOrderid(1);
            orderDetail.setOrderPrice("1USD");
            orderDetail.setOrderSku("Sku1");
    
            orderDetailList.add(orderDetail);
    
            OrderDetail orderDetail2 = new OrderDetail();
            orderDetail2.setOrderid(1);
            orderDetail2.setOrderPrice("2USD");
            orderDetail2.setOrderSku("Sku2");
            orderDetailList.add(orderDetail2);
    
            try {
                HashMap addMap = new HashMap();
                HashMap addValMap = new HashMap();
                addMap.put("orderDetail", Class.forName("java.util.List"));
                addValMap.put("orderDetail", orderDetailList);
                Object obj2= new ClassUtil().dynamicClass(order,addMap,addValMap);
    
                System.out.println(JSON.toJSONString(obj2));
            } catch (Exception e) {
                e.printStackTrace();
            }

     

    展开全文
  • Java 动态为类添加属性

    千次阅读 2019-10-11 09:28:37
    “衰兰送客咸阳道,天若有情天亦老” 序 有一个这样的功能:展示一个报表,表头是动态的,可以手动新增或删除,也就是说会修改表结构,...但是这里说说给实体类动态添加属性。 实现代码 import com.google.common...

    “衰兰送客咸阳道,天若有情天亦老”

    有一个这样的功能:展示一个报表,表头是动态的,可以手动新增或删除,也就是说会修改表结构,新增或删除表字段。然而一般实体类都是对应表结构的,那么如何给实体增加属性呢?虽然我自己的解决方案是直接返回List<map>,然后让对应的列适配到map的key中。但是这里说说给实体类动态添加属性。

    实现代码

    
    import com.google.common.collect.Maps;
    import net.sf.cglib.beans.BeanGenerator;
    import net.sf.cglib.beans.BeanMap;
    import org.apache.commons.beanutils.PropertyUtilsBean;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     *@author 
     *@date 2019/10/9
     *@description
     */
    public class ReflectUtil {
    
        static Logger logger = LoggerFactory.getLogger(ReflectUtil.class);
    
        public static Object getTarget(Object dest, Map<String, Object> addProperties) {
            // get property map
            PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
            PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest);
            Map<String, Class> propertyMap = Maps.newHashMap();
            for (PropertyDescriptor d : descriptors) {
                if (!"class".equalsIgnoreCase(d.getName())) {
                    propertyMap.put(d.getName(), d.getPropertyType());
                }
            }
            // add extra properties
            for (Map.Entry<String, Object> entry : addProperties.entrySet()) {
                propertyMap.put(entry.getKey(), entry.getValue().getClass());
            }
    //        addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass()));
            // new dynamic bean
            DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap);
            // add old value
            for (Map.Entry<String, Class> entry : propertyMap.entrySet()) {
                try {
                    // filter extra properties
                    if (!addProperties.containsKey(entry.getKey())) {
                        dynamicBean.setValue(entry.getKey(), propertyUtilsBean.getNestedProperty(dest, entry.getKey()));
                    }
                } catch (Exception e) {
                    logger.error(e.getMessage(), e);
                }
            }
            ;
            // add extra value
            for (Map.Entry<String, Object> entry : addProperties.entrySet()) {
                try {
                    dynamicBean.setValue(entry.getKey(), entry.getValue());
                } catch (Exception e) {
                    logger.error(e.getMessage(), e);
                }
            }
            ;
            Object target = dynamicBean.getTarget();
            return target;
        }
    
        public static class DynamicBean {
            /**
             * 目标对象
             */
            private Object target;
    
            /**
             * 属性集合
             */
            private BeanMap beanMap;
    
            public DynamicBean(Class superclass, Map<String, Class> propertyMap) {
                this.target = generateBean(superclass, 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 this.target;
            }
    
    
            /**
             * 根据属性生成对象
             *
             * @param superclass
             * @param propertyMap
             * @return
             */
            private Object generateBean(Class superclass, Map<String, Class> propertyMap) {
                BeanGenerator generator = new BeanGenerator();
                if (null != superclass) {
                    generator.setSuperclass(superclass);
                }
                BeanGenerator.addProperties(generator, propertyMap);
                return generator.create();
            }
        }
    
        public static void main(String[] args) {
            TestClass entity = new TestClass();
            entity.setAge(15);
            entity.setId(1);
            entity.setName("张三");
            //动态设置属性字段
            Map<String, Object> addProperties = new HashMap() {{
                put("sex", "男");
                put("telephone", "123456789");
            }};
            //获取实体中给属性的值
            Object target = getTarget(entity, addProperties);
            System.out.println(getFieldValueByName("id", target));
            System.out.println(getFieldValueByName("name", target));
            System.out.println(getFieldValueByName("age", target));
            System.out.println(getFieldValueByName("sex", target));
            System.out.println(getFieldValueByName("telephone", target));
        }
    
        //获取实体中属性的值
        private static Object getFieldValueByName(String fieldName, Object o) {
            try {
                //通过反射获取值
                String firstLetter = fieldName.substring(0, 1).toUpperCase();
                String getter = "get" + firstLetter + fieldName.substring(1);
                Method method = o.getClass().getMethod(getter, new Class[]{});
                Object value = method.invoke(o, new Object[]{});
                return value;
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
                return null;
            }
        }
    
        //测试类
        public static class TestClass{
            //ID
            private int id;
            //名字
            private String name;
            //年龄
            private int age;
    
            public int getId() {
                return id;
            }
    
            public void setId(int id) {
                this.id = id;
            }
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
    
            public int getAge() {
                return age;
            }
    
            public void setAge(int age) {
                this.age = age;
            }
        }
    
    }
    
    

    结果:
    在这里插入图片描述
    本文参考至:JAVA“动态”为类添加属性

    展开全文
  • 下面小编就为大家带来一篇Java通过反射机制动态设置对象属性值的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • java对象动态添加属性

    万次阅读 热门讨论 2018-09-03 16:53:28
    、不知道大家有没有遇到过这样的需求 ,就java运行的时候 动态给你java对象添加属性,最近在项目终于到了,想到了反射去实现,但是最终也没有搞出来。。。哎。。 有的时候 比如你用的是hibernate或者Spring jdb.....

    抓狂、不知道大家有没有遇到过这样的需求 ,就java运行的时候 动态给你java对象添加属性,最近在项目终于到了,想到了反射去实现,但是最终也没有搞出来。。。哎。。


    有的时候 比如你用的是hibernate或者Spring jdbc 来做dao层进行数据库相关的操作的时候,若果是单表的操作的时候 还比较简单 hibernate可直接返回(get,load)你的需要的po,spring3可以用rowmapper的实现类来处理这个操作,这些操作对于大家来说都是熟悉的不能在熟悉了。

    疑问、问题:当进行多个表进行连接的操作时候,如:

    select p.id,p.name,ad.address,ad.post_code from person  p join person_address ad on p.id = ad.person_id
     


    现在有两张表进行查询 ,查询出来是两个表的字段,hibernate中也许你会想创建一个含有这些字段的vo就可以了解决了 (或者基于这个查询建立以个视图 ,然后基于这个视图在用hibernate进行orm映射,),在spring3里会用到org.springframework.jdbc.core.BeanPropertyRowMapper如:

    this.jdbcTemplate.queryForObject(sql,BeanPropertyRowMapper.newInstance(PersonAdressVo.class));//返回PersonAdressVo对象
     

    是的这样的确可以解决,想想如果你的好的查询,而且结果都不一样,连接的表也是很多,那么你创建的vo或者是视图肯定是泛滥的,整个项目就会臃肿起来,这是我们不想看到的。

    大笑、现在说说解决方法:

    你可以在进行查询结果的时候,为你联合查询出来的Object 动态添加你查出来的属性;

    下面来说一下具体的代码:

    此时需要你需要cglib-nodep-2.2.jar,自己google下载

    DynamicBean.java

    
     
    1. package com.ajun.spring.orm;
    2. import java.util.Iterator;
    3. import java.util.Map;
    4. import java.util.Set;
    5. import net.sf.cglib.beans.BeanGenerator;
    6. import net.sf.cglib.beans.BeanMap;
    7. /**
    8. *
    9. * @author ajun
    10. *
    11. */
    12. public class DynamicBean {
    13. /**
    14. * 实体Object
    15. */
    16. private Object object = null;
    17. /**
    18. * 属性map
    19. */
    20. private BeanMap beanMap = null;
    21. public DynamicBean() {
    22. super();
    23. }
    24. @SuppressWarnings( "unchecked")
    25. public DynamicBean(Map propertyMap) {
    26. this.object = generateBean(propertyMap);
    27. this.beanMap = BeanMap.create( this.object);
    28. }
    29. /**
    30. * 给bean属性赋值
    31. * @param property 属性名
    32. * @param value 值
    33. */
    34. public void setValue(String property, Object value) {
    35. beanMap.put(property, value);
    36. }
    37. /**
    38. * 通过属性名得到属性值
    39. * @param property 属性名
    40. * @return
    41. */
    42. public Object getValue(String property) {
    43. return beanMap.get(property);
    44. }
    45. /**
    46. * 得到该实体bean对象
    47. * @return
    48. */
    49. public Object getObject() {
    50. return this.object;
    51. }
    52. /**
    53. * @param propertyMap
    54. * @return
    55. */
    56. @SuppressWarnings( "unchecked")
    57. private Object generateBean(Map propertyMap) {
    58. BeanGenerator generator = new BeanGenerator();
    59. Set keySet = propertyMap.keySet();
    60. for (Iterator i = keySet.iterator(); i.hasNext();) {
    61. String key = (String) i.next();
    62. generator.addProperty(key, (Class) propertyMap.get(key));
    63. }
    64. return generator.create();
    65. }
    66. }

    测试类:

    
     
    1. public static void main(String[] args) throws ClassNotFoundException {
    2. // 设置类成员属性
    3. HashMap propertyMap = new HashMap();
    4. propertyMap.put( "id", Class.forName( "java.lang.Integer"));
    5. propertyMap.put( "name", Class.forName( "java.lang.String"));
    6. propertyMap.put( "address", Class.forName( "java.lang.String"));
    7. // 生成动态 Bean
    8. DynamicBean bean = new DynamicBean(propertyMap);
    9. // 给 Bean 设置值
    10. bean.setValue( "id", new Integer( 123));
    11. bean.setValue( "name", "454");
    12. bean.setValue( "address", "789");
    13. // 从 Bean 中获取值,当然了获得值的类型是 Object
    14. System.out.println( " >> id = " + bean.getValue( "id"));
    15. System.out.println( " >> name = " + bean.getValue( "name"));
    16. System.out.println( " >> address = " + bean.getValue( "address"));
    17. // 获得bean的实体
    18. Object object = bean.getObject();
    19. // 通过反射查看所有方法名
    20. Class clazz = object.getClass();
    21. Method[] methods = clazz.getDeclaredMethods();
    22. for ( int i = 0; i < methods.length; i++) {
    23. System.out.println(methods[i].getName());
    24. }
    25. }

    在这里在举一个spring jdbc中查询多个表 ,返回一个动态bean的例子:
    首先是你在用spring3 jdbc进行查询的时候 这时候你想返回一个对象 此时你一般的做法是:

    
     
    1. String sql= "select p.id,p.name,ad.address,ad.post_code from person p join person_address ad on p.id = ad.person_id"; //此时你返回是多个表的结果
    2. this.jdbcTemplate.queryForObject(sql,BeanPropertyRowMapper.newInstance(PersonAddressVO.class), id); //返回一个含有多个表的属性的vo:PersonAddressVO
    随着你的业务的复杂也许你vo会很多 ,为了减少你vo的数量 ,应该动态返回一个bean 此时bean含有你想要的的属性。

    我们在用spring jdbc 进行查询 就行orm映射的时候 都要是首先实现org.springframework.jdbc.core.RowMapper,因为spring jdbc查询的时候你要进行orm要求一个参数必须为org.springframework.jdbc.core.RowMapper,所以此时我要实现org.springframework.jdbc.core.RowMapper里的public Object mapRow(ResultSet rs, int rowNum) f。

    
     

    里面我们会用前面的DynamicBean.java

    1. <code class="language-java">package com.ajun.spring.orm;  
    2.   
    3. import java.sql.ResultSet;  
    4. import java.sql.ResultSetMetaData;  
    5. import java.sql.SQLException;  
    6. import java.util.HashMap;  
    7.   
    8. import org.springframework.jdbc.core.RowMapper;  
    9. import org.springframework.jdbc.support.JdbcUtils;  
    10.   
    11.   
    12.   
    13. /** 
    14.  ********************************************************************************* 
    15.  * 例子:数据库:person_id <----->po:personId 请写好驼峰表示风格 
    16.  ********************************************************************************* 
    17.  * @author ajun 
    18.  */  
    19. @SuppressWarnings("unchecked")  
    20. public class CustomRowMapper implements RowMapper {  
    21.   
    22.       
    23.     @Override  
    24.     public Object mapRow(ResultSet rs, int rowNum) throws SQLException {  
    25.             return this.toDynamicObject(rs, rowNum);  
    26.     }  
    27.       
    28.     private  Object toDynamicObject(ResultSet rs, int rowNum) throws SQLException{  
    29.         DynamicBean dyBean  =null;  
    30.         ResultSetMetaData rsmd = rs.getMetaData();  
    31.         if(rsmd!=null){  
    32.             int columnCount = rsmd.getColumnCount();  
    33.             HashMap propertyMap = new HashMap();  
    34.             for (int index = 1; index <= columnCount; index++){//JdbcUtils自己查spring API  
    35.                 String column = JdbcUtils.lookupColumnName(rsmd, index);  
    36.                 String propertyName = JdbcUtils.convertUnderscoreNameToPropertyName(column);  
    37.                 propertyMap.put(propertyName, Object.class);//添加动态属性 此时person_address ==>personAddress  
    38.             }  
    39.             dyBean = new DynamicBean(propertyMap);  
    40.             for (int index = 1; index <= columnCount; index++){  
    41.                 String column = JdbcUtils.lookupColumnName(rsmd, index);  
    42.                 String propertyName = JdbcUtils.convertUnderscoreNameToPropertyName(column);  
    43.                 Object value = JdbcUtils.getResultSetValue(rs, index);  
    44.                 dyBean.setValue(propertyName, value);//设置值  
    45.             }  
    46.         }  
    47.         return dyBean.getObject();  
    48.     }  
    49.       
    50.       
    51.     public static  CopyOfCustomRowMapper newInstance() {  
    52.         CopyOfCustomRowMapper newInstance = new CopyOfCustomRowMapper();  
    53.         return newInstance;  
    54.     }  
    55.   
    56. }  
    57. </code>  
    
      
    1. package com.ajun.spring.orm;
    2. import java.sql.ResultSet;
    3. import java.sql.ResultSetMetaData;
    4. import java.sql.SQLException;
    5. import java.util.HashMap;
    6. import org.springframework.jdbc.core.RowMapper;
    7. import org.springframework.jdbc.support.JdbcUtils;
    8. /**
    9. *********************************************************************************
    10. * 例子:数据库:person_id <----->po:personId 请写好驼峰表示风格
    11. *********************************************************************************
    12. * @author ajun
    13. */
    14. @SuppressWarnings( "unchecked")
    15. public class CustomRowMapper implements RowMapper {
    16. @Override
    17. public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    18. return this.toDynamicObject(rs, rowNum);
    19. }
    20. private Object toDynamicObject(ResultSet rs, int rowNum) throws SQLException{
    21. DynamicBean dyBean = null;
    22. ResultSetMetaData rsmd = rs.getMetaData();
    23. if(rsmd!= null){
    24. int columnCount = rsmd.getColumnCount();
    25. HashMap propertyMap = new HashMap();
    26. for ( int index = 1; index <= columnCount; index++){ //JdbcUtils自己查spring API
    27. String column = JdbcUtils.lookupColumnName(rsmd, index);
    28. String propertyName = JdbcUtils.convertUnderscoreNameToPropertyName(column);
    29. propertyMap.put(propertyName, Object.class); //添加动态属性 此时person_address ==>personAddress
    30. }
    31. dyBean = new DynamicBean(propertyMap);
    32. for ( int index = 1; index <= columnCount; index++){
    33. String column = JdbcUtils.lookupColumnName(rsmd, index);
    34. String propertyName = JdbcUtils.convertUnderscoreNameToPropertyName(column);
    35. Object value = JdbcUtils.getResultSetValue(rs, index);
    36. dyBean.setValue(propertyName, value); //设置值
    37. }
    38. }
    39. return dyBean.getObject();
    40. }
    41. public static CopyOfCustomRowMapper newInstance() {
    42. CopyOfCustomRowMapper newInstance = new CopyOfCustomRowMapper();
    43. return newInstance;
    44. }
    45. }
    调用的时候:

    
     
    1. String sql= "select p.id,p.name,ad.address,ad.post_code from person p join person_address ad on p.id = ad.person_id"; //此时你返回是多个表的结果
    2. List<Object> list = this.jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance()); //返回一个含有多个表的属性的动态bean

    在页面上你就可以用el表达式这样去出来:

    
     
    1. <c:forEach items="${list}" var="p">
    2. <tr>
    3. <td>${p.id} </td>
    4. <td>${p.name} </td>
    5. <td>${p.address} </td>
                            <td>${p.postCode}</td>
     
    </tr> </c:forEach>
     
     
    

     
    
    这样是不是很方便呢 ,呵呵 偷笑


     
    
     
    
     
    
     
    
     
    
     
    
     
    
     
    
    阅读更多 登录后自动展开
    展开全文
  • Java动态添加属性字段

    万次阅读 2018-10-22 18:35:11
    因为列是动态的, 首先想到的就是后天拼接JSON格式字符串, 然后返回到前台, 组装表头及内容。 但是当前系统中easyUI版本为1.2,并不支持 data属性(官方从1.3.2开始支持)。所以只能返回list&lt;T&gt; 格式...

    说明:做项目中遇到一种场景,需要根据查询时间段, 获取时间段中中每个月份对应的金额(费用统计)。如截图中的两列

    因为列是动态的, 首先想到的就是后天拼接JSON格式字符串, 然后返回到前台, 组装表头及内容。 但是当前系统中easyUI版本为1.2,并不支持 data属性(官方从1.3.2开始支持)。所以只能返回list<T> 格式。

    网上一搜相关代码很多, 看客可以自己搜索一下。 我这里记录一下我当时使用场景及用法,已备以后使用。

     

    1.需要引用cglib jar包, 我用的版本是2.2

    2.建一个实体对象 DynamicBean.java 。主要用来处理对象。

    public class DynamicBean {
        private Object object = null; // 动态生成的类
    
        private BeanMap beanMap = null; // 存放属性名称以及属性的类型
    
        public DynamicBean() {
            super();
        }
    
        public DynamicBean(Map propertyMap) {
            this.object = generateBean(propertyMap);
            this.beanMap = BeanMap.create(this.object);
        }
    
        /**
         * @param propertyMap
         * @return
         */
        private Object generateBean(Map propertyMap) {
            BeanGenerator generator = new BeanGenerator();
            Set keySet = propertyMap.keySet();
            for (Iterator<String> i = keySet.iterator(); i.hasNext();) {
                String key = (String) i.next();
                generator.addProperty(key, (Class) propertyMap.get(key));
            }
            return generator.create();
        }
    
        /**
         * ��bean���Ը�ֵ
         * @param property ������
         * @param value ֵ
         */
        public void setValue(Object property, Object value) {
            beanMap.put(property, value);
        }
    
        /**
         * ͨ���������õ�����ֵ
         * @param property ������
         * @return ֵ
         */
        public Object getValue(String property) {
            return beanMap.get(property);
        }
    
        /**
         * 返回新生成的对象
         * @return
         */
        public Object getObject() {
            return this.object;
        }
    }

    3. 原来对象, 及需要拼接到对象中的属性字段集合处理方法。

    /**
    *参数说明:
    *  object : 查询结果数组中对象。
    *  moneyMap : 为对象对应所有月份数据集合
    *  解释:已经查询出一组账单对象集合List<Bill> , 而moneyMap为对象中的一个属性 
    *  Map<String,Bigdecimal>, 存放了月份及金额
    */
    private Object dynamicClass(Object object, Map<String, BigDecimal> moneyMap) throws Exception {
            // 字段 - 值 集合
            HashMap<String, Object> returnMap = new HashMap<String, Object>();
            // 字段 - 字段类型 集合
            HashMap<String, Object> typeMap = new HashMap<String, Object>();
            // 获取传入类
            Class<? extends Object> type = object.getClass();
            BeanInfo beanInfo = Introspector.getBeanInfo(type);
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            // 获取对象中已存在的数据
            for (int i = 0; i < propertyDescriptors.length; i++) {
                PropertyDescriptor descriptor = propertyDescriptors[i];
                String propertyName = descriptor.getName();
                if (!propertyName.equals("class") && !propertyName.equals("monthMap")) {
                    Method readMethod = descriptor.getReadMethod();
                    Object result = readMethod.invoke(object, new Object[0]);
                    if (result != null) {
                        returnMap.put(propertyName, result);
                    } else {
                        String propertyType = descriptor.getPropertyType().toString();
                        if (propertyType.contains("java.math.BigDecimal")) {
                            returnMap.put(propertyName, new BigDecimal(0));
                        } else {
                            returnMap.put(propertyName, "");
                        }
                    }
                    typeMap.put(propertyName, descriptor.getPropertyType());
                }
            }
            // 获取月份数据, 变为字段属性
            Set<String> monthKeys = moneyMap.keySet();
            for (Iterator<String> it = monthKeys.iterator(); it.hasNext();) {
                String key = (String) it.next();
                // 字段类型
                typeMap.put(key, Class.forName("java.math.BigDecimal"));
                // 字段对应值
                returnMap.put(key, moneyMap.get(key));
            }
            // map转换成实体对象
            DynamicBean bean = new DynamicBean(typeMap);
            // 赋值
            Set<String> keys = typeMap.keySet();
            for (Iterator<String> it = keys.iterator(); it.hasNext();) {
                String key = (String) it.next();
                bean.setValue(key, returnMap.get(key));
            }
            Object obj = bean.getObject();
            return obj;
        }

     

    做笔记使用, 说不定以后还会用到。

    展开全文
  • java动态给实体类添加属性

    千次阅读 2020-04-10 11:01:19
    java动态给实体类添加属性 需要的jar包有两个:cglib-3.1.jar 和 google-collections-1.0.jar 如果是maven项目,就不需要cglib-3.1.jar,直接用spring自带的 org.springframework.cglib即可。 1、创建一个实体:...
  • 设置注解的属性 实例 定义 使用 个人遇到的使用场景 场景导入 实例 代码地址 引用 系列导航 设置注解的属性 这种使用场景比较少,但是不失为一种对于注解的深入理解。 实例 定义 Tag.java ...
  • * @param addValMap 动态需要添加属性属性值 * @return 新的对象 * @throws Exception */ public Object dynamicClass(Object object,HashMap addMap, HashMap addValMap) throws Exception { HashMap ...
  • JAVA动态”为类添加属性

    万次阅读 2018-01-04 19:35:07
    来源 : https://www.cnblogs.com/frinder6/p/7204574.html部分参考:http://www.cnblogs.com/zy2009/p/6725843.htmlpom.xml中添加:1234567891011&lt;dependency&gt; &lt;groupId&gt;commons-...
  • NULL 博文链接:https://linleizi.iteye.com/blog/1722171
  • Java动态修改注解的属性

    千次阅读 2019-06-13 19:10:01
    以往来看,注解的属性值一般都是“硬编码”。但最近在开发过程中遇到了需要根据运行环境来设置Retention 为 RUNTIME (运行期保留)的注解属性值的需求。举个例子: @Table(name="t1") public class Test { private...
  • Java动态生成类以及动态添加属性

    万次阅读 2014-08-10 17:25:15
    有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象propertities文件。  那么技术实现支持:使用cgilib代理。  具体的实现步骤:  1.cglib的jar包(cglib-nodep):我用...
  • 主要介绍了java枚举类的属性、方法和构造方法应用,结合实例形式分析了java枚举类的定义、构造及相关应用操作技巧,需要的朋友可以参考下
  • 动态给类和对象添加属性和方法

    千次阅读 2017-10-20 15:09:30
    动态给类和对象添加属性和方法动态给类和对象添加属性定义一个Person类class Person(object): def __init__(self, name): self.name = name给对象添加属性 # 创建2个Person,分别为p1,p2p1 = Person('amy') print...
  • 在开发过程中经常会遇到java对象的属性特征不确定的情况,比如属性的名称,属性的类型,属性的取值等不确定的情况,如何在java...动态的设置java对象的属性值?借助java反射机制以及javassist能够轻松解决这些问题。
  • 动态增加和删除对象的属性

    千次阅读 2019-04-17 18:17:37
    特别是动态添加和删除对象属性增加对象的属性用push来动态拼接。 ``` for(let i=0;i<this.reimMachineInvoice.length;i++){ for(let j=0;j<this.reimMachineInvoice[i].reimMachineI...
  • @Document(indexName = "#{@articleIndexName}", type = "java") public class ArticleModel implements Serializable{ private static final long seriaVersionUID = 6320548148250372656L; @Id private String ...
  • java反射机制动态设置类的属性

    千次阅读 2017-08-16 14:03:50
    2.利用反射机制动态给实体类所有属性赋值 public class ReflectTest {  /**  * @param args  */  public static void main(String[] args) {  // TODO Auto-generated method stub  ...
  • Java反射一 动态修改类的属性

    千次阅读 2017-07-13 11:07:14
    Person.java package fanshe; public class Person { private int age; private String name; private String info(){ return "My name is "+ name +", I'm "+age+" years old."; } private
  • NULL 博文链接:https://ilyon.iteye.com/blog/1847567
  • 利用java反射来动态的进行类中方法的基本操作 作为开发项目中,在一定的应用场景下使用类的反射会使代码更简洁,增加复用性,以下写的一个测试可以参考下 此类反射的demo希望对您有用 废话不多说,上代码 创建的...
  • 在我看Stackoverflow的时候,我碰到了这样一个有趣的问题:如何将Java属性文件Properties File绑定到Java接口。这个想法简单却有用! 当我们想在应用中使用常量的时候,我们只需简单地用一下loginConstants.app...
  • from types import MethodType #创建一个空类 class Person(object): __slots__ = ("name","age",...#动态添加属性,这体现了动态语言的特点(灵活) per.name = "tom" print(per.name) ''' #动态添加方法 d...
  • JavaBean动态添加删除属性

    千次阅读 2016-10-13 17:29:00
    用cglib动态删除添加属性时,虽然obj里有getUsername这个方法,却不能obj.getUsername()这样直接调用,想得到username的值只能通过beanMap.get("username")获取. org.apache.commons.beanutils从源码来看是使用...
  • Java动态给序列化JSON添加对象

    千次阅读 2019-04-18 20:27:59
    在有时候我们将动态对象转成JSON。需要将另外动态对象插入到JSON中时。就需要如下操作: 工作中,将亚马逊接口通用化的时候。需要将订单明细B 加入到订单主体A中。并且自定义属性AmazonOrderDetail。 正常的操作是...
  • PageOffice Java 动态填充Word模版

    热门讨论 2013-03-06 13:47:25
    以生成工资条为例,演示了通过PageOffice开发平台,用Java语言实现Word文档的在线打开、编辑和保存,数据区域数据的动态填充和提交,数据区域插入Word文件,动态填充和提交Word文件中Tabel的数据
  • Java动态代理在一些中间件中经常用到,或者一些大型项目中都会用到。 这里顺带使用一下自定义注解方式,基于java 反射机制读取.properties格式文件。 demo的大致内容包含以下: 1.配置文件:config.properties url=...
  • Java读取Excel文件自定义属性

    千次阅读 2019-02-27 14:12:44
    Java读取Excel文件自定义属性1添加maven依赖2读取Excel文件属性自定义列3代码 1添加maven依赖 &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;/groupId&gt; &lt;artifactId&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,039,280
精华内容 415,712
关键字:

java动态增加属性

java 订阅