`

javabean 嵌套属性赋值

    博客分类:
  • java
阅读更多

import java.beans.PropertyDescriptor;
import org.apache.commons.beanutils.PropertyUtils;

/**
 * 需beanutils jar包
 * 属性格式嵌套用"."相隔
 */
public class Test {
    public static void main(String[] args) throws Exception {
        Class<?> c = A.class;
        Object instance = c.newInstance();
        String name ="name";
        String value ="aname";
        setBeanProperty(instance, name, value);
        name = "b.name";
        value="bname";
        setBeanProperty(instance, name, value);
        A a = (A) instance;
        System.out.println(a.getName()+":"+a.getB().getName());
    }
    
    /** 
     * populate property 
     * @param o  实例对象
     * @param name 被赋值属性字符描述 格式:a.b.c.....
     * @param value 原始值
     * @throws Exception
     */
    private static void setBeanProperty(Object o,String name,String value) throws Exception{
        String[] propDiscribe = name.split("\\.");
        if(propDiscribe.length==1){//simple
            PropertyUtils.setProperty(o, name, value);
        }else{//nested property
            if(initNestedProperties(o,name)){
                PropertyUtils.setNestedProperty(o, name, value);
            };
        }
    }
    
    /** 
     * 初始化嵌套属性前面的对象
     * 如a.b.name 先检测对象a的b属性是否为null,若是构造空对象
     * @param obj
     * @param fieldDescribe
     * @return
     */
    private static boolean initNestedProperties(Object obj, String fieldDescribe){
        try{
            String[] fieldNames = fieldDescribe.split("\\.");
            if (fieldNames.length > 1) {
                StringBuffer nestedProperty = new StringBuffer();
                for (int i = 0; i < fieldNames.length - 1; i++) {
                    String fn = fieldNames[i];
                    if (i != 0) {
                        nestedProperty.append(".");
                    }
                    nestedProperty.append(fn);
                    Object value = PropertyUtils.getProperty(obj, nestedProperty.toString());
                    if (value == null) {
                        PropertyDescriptor propertyDescriptor = PropertyUtils.getPropertyDescriptor(obj, nestedProperty.toString());
                        Class<?> propertyType = propertyDescriptor.getPropertyType();
                        Object newInstance = propertyType.newInstance();
                        PropertyUtils.setProperty(obj, nestedProperty.toString(), newInstance);
                    }
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}



public class A {
    private String name;
    private B b;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public B getB() {
        return b;
    }
    public void setB(B b) {
        this.b = b;
    }
}


public class B {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
分享到:
评论

相关推荐

    表单数据自动封装到javaBean中

    在某些情况下,可能需要自定义封装逻辑,比如处理复杂的嵌套数据结构,或者需要在赋值前后执行额外的操作。这时,可以使用JavaBean的预设方法(如`@PreSet`和`@PostSet`)或者自定义转换器。 7. **工具类和库**: ...

    xml与javabean的转换

    这个方法通常接收一个XML字符串作为参数,并根据预先定义的映射规则,解析XML中的元素和属性,将其赋值给JavaBean的对应属性。映射规则可以是硬编码的,也可以通过注解或其他配置文件来指定。一旦解析完成,`fromXml...

    BeanUtils类库jar包和源码

    这个类库提供了许多实用方法,能够简化Java开发中的对象属性赋值和获取过程,极大地提高了开发效率。在Java后端开发中,尤其是在与数据库交互时,BeanUtils扮演了重要的角色。 首先,BeanUtils的核心功能在于属性的...

    JSON与JAVA数据的相互转换 (2).pdf

    注意,由于JSON解析后的列表对象不包含类型信息,因此在转换时可能会出现警告,提示尝试将属性赋值给错误的类。这通常是因为JSON中的键与JavaBean的属性名称匹配,但类型不匹配。 ```java List&lt;T2&gt; lists2 = t....

    JavaWeb开发技术-BeanUtils工具.pptx

    深度拷贝允许复制一个JavaBean的所有属性到另一个JavaBean,即使它们是嵌套的或者包含复杂的数据结构。对于集合类型的处理,BeanUtils可以将集合元素一一映射到JavaBean对象,反之亦然,这对于数据转换非常有用。 ...

    BeanUtils所需的包

    这个库大大简化了JavaBean之间的属性赋值操作,特别是在处理大量数据映射时,提供了很大的便利。BeanUtils是Apache Commons项目的一部分,它包含了多个与JavaBean相关的实用工具类。 BeanUtils的核心功能在于提供了...

    JSON与JAVA数据的相互转换.pdf

    在上述示例的运行结果中,出现了`JSONObject toBean`警告,提示尝试将`bbb`属性赋值给`T3`类,这通常是由于JSON数据中的某个字段在目标JavaBean类中没有相应的属性。为了解决这个问题,需要确保JSON数据中的每个字段...

    commons-beanutils-1.8.3.jar commons-codec-1.7.jar commons-collections-3.2.1.jar

    - 它还提供了`PropertyUtils`类,可以方便地处理复杂的bean属性,如嵌套属性和集合属性。 2. **Apache Commons Codec**: - Commons Codec库提供了多种编码和解码算法的实现,这些算法在处理字符串或数据时非常...

    beanUtils全套JAR包

    这在数据模型转换或者表单验证时非常有用,可以避免手动一个一个属性进行赋值。 2. **类型转换** BeanUtils在进行属性拷贝时,会自动处理类型转换。例如,源对象的某个属性是字符串,目标对象对应的属性是整型,...

    commons.jar

    `PropertyUtils`类则提供了更多的属性操作方法,如获取、设置属性值,甚至可以处理复杂的嵌套属性。 这些Apache Commons库在实际开发中非常常用,它们通过提供高度封装的函数和工具类,降低了代码复杂度,提高了...

    BeanUtilsBean对象复制使用(类型可以自动转化)

    4. **递归复制**:如果源对象或目标对象的属性是另一个复杂对象,`BeanUtilsBean`会递归地调用自身,处理嵌套的对象复制。 5. **异常处理**:在复制过程中,如果遇到无法转换的类型或空值,`BeanUtilsBean`通常会抛...

    commons-beanutils-1.9.2下载

    1. **属性访问**:BeanUtils提供了`getProperty()`和`setProperty()`方法,可以方便地读取和设置JavaBean对象的属性,即使属性是嵌套的,也可以通过点号分隔的路径来操作。 2. **类型转换**:库内置了多种类型的...

    JSP JSTL 标签库详解 (一个不漏)

    set 标签用于为变量或 JavaBean 中的变量属性赋值的工作。这个标签用于在某个范围(page、request、session、application 等)中使用某个名字设定特定的值,或者设定某个已经存在的 javabean 对象的属性。他类似于 (...

    dwr返回对象.doc

    例如,如果JavaBean有一个`name`属性,我们可以通过`data.name`来访问它。 5. **返回List、Map和Set** 当Java方法返回`List`、`Map`或`Set`等集合类型时,DWR同样会自动转换成JavaScript数组或对象。对于`List`,...

    webwork 标签手册

    当需要在页面上使用一些简单的JavaBean对象时,可以直接利用`bean`标签创建这些对象,并初始化它们的属性: ```xml ``` #### 四、总结 通过本文的介绍,我们可以看到WebWork提供的标签库非常实用且强大。...

    2021-2022计算机二级等级考试试题及答案No.19527.docx

    在JSP页面中,正确引入JavaBean的语法是使用指令的import属性引入,因此C选项正确。 IPTV代表Internet Protocol Television,即网络电视,通过互联网传输电视内容。 C语言的循环结构中,给出的程序段会打印三个星...

    Struts1.x.pdf

    - `commons-beanutils.jar`:简化了POJO的属性赋值和拷贝操作。 - `commons-validator.jar`:用于表单验证。 - **Struts标记库文件(tld)**: - `struts-bean.tld`:提供与Bean相关的标签。 - `struts-...

    2021-2022计算机二级等级考试试题及答案No.1948.docx

    4. C语言中,不同函数可以使用相同名字的变量,函数可以没有返回值,但函数不能嵌套定义,因此B选项是错误的。 5. Python的fun1函数使用*args接收可变数量的位置参数,打印结果将分别打印a、b和args元组,所以正确...

    MATLAB设计_将readObj文件转换为Matlab结构.zip

    这种转换可能会遇到的问题包括类型不兼容、嵌套对象处理、以及Java特定特性的缺失,如静态方法或私有属性。因此,`readObj`函数可能需要包含错误处理和适配代码,以确保成功转换。 8. **应用实例**: 这种技术...

Global site tag (gtag.js) - Google Analytics