java-依赖注入的实现

package xml;

import java.io.InputStream;
import java.lang.reflect.Method;

/**
 * <person className="com.Person">
 *      <property name="name">张三</property>
 *      <property name="address">北京市</property>
 * </person>
 *
 * 要求:DOM4J,读取xml文件
 * className的属性值,反射创建该类的对象
 * 读取到name="name" 张三 反射调用 setName()方法存储张三
 * 读取到name="address" 反射调用setAddress()存储北京市
 *
 * 效果相当于:
 * Person person = new Person();
 * person.setName("张三");
 * person.setAddress("北京市");
 * System.out.println(person);
 */
public class DiDemo {
    public static void main(String[] args) throws Exception{
        InputStream inputStream = DiDemo.class.getClassLoader().getResourceAsStream("person.xml");
        SAXReader saxReader = new SAXReader();
        Doucment doucment = SAXReader.read(inputStream);
        //获取跟标签
        Element rootElemnt = doucment.getRootElement();
        //获取子标签person
        List<Element> personElements = rootElemnt.elements();
        if(personElements != null && personElements.size()>0){
            for(Element personElement : personElements){
                //获取person标签的属性 className的值
                String className = personElement.attributeValue("className");
                //反射,将类加入到内存
                Class c = Class.forName(className);
                //创建类对象
                Object object = c.newInstance();
                //获取person标签的子标签 property
                List<Element> propertyElements = personElement.elements();
                if(propertyElements != null && propertyElements.size()>0){
                    //propertyElement每个子标签property
                    //取出property标签的属性name和他的标签文本
                    for(Element propertyElement : propertyElements){
                        String name = propertyElement.attributeValue("name");
                        String text = propertyElement.getText();
                        //反射获取该成员set方法,进行赋值
                        String methodName = "set" + name.substring(0,1).toUpperCase() + name.substring(1);
                        Method method = c.getMethod(methodName,String.class);
                        method.invoke(object,text);
                    }
                }

            }
        }


    }
}

package com.Person;

import lombok.Data
    
@Data
//该注解使得我们不需要自己写set get方法
public class Person { 
    private String name;
    private String Address;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值