输入字符串“属性名称:属性值|属性名称:属性值....."设置属性(反射)

假设一个类中有几十个属性,如果我们通过setter()一个个设置,显然效率较低。现在希望对程序简化,输入字符串“属性名称:属性值|属性名称:属性值.....",就可以将属性设置好。

具体做法步骤为:

1.对输入的字符串进行解析。

2.对属性名称进行设置,设置为对应的set方法名的形式,并存放在Map(K-V)中。

3.通过Class对象获取类的所有方法,遍历,一旦与set方法名(Map中的K)相同,就进行设置其值为V。

注意:放入Map中Key的类型是String,Value的类型根据属性类型而定。为了不产生参数异常错误,这里同一使用Object类型的属性。

实现代码:

package com.com.company.reflection;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

class Person{
    private String name;
    private Object age;

    public String getName() {
        return name;
    }

    public Object getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public void setAge(Object age) {
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class TestAnnotation {
    public static void main(String[] args) throws Exception {
        String str="name:xunpu|age:21";
        //解析字符串,并且装入map
       Map<String,Object> map=getKV(str);
        Class pclass=Person.class;
        Person p=(Person)pclass.newInstance();
        //设置对应的属性
        Object person=setPropertities(p,map);
        System.out.println(person);
    }
    //解析字符串,并且将属性名变为对应的set属性名,并且把set()和相应的属性值放入Map
    public static Map<String,Object> getKV(String str) throws Exception {
        Map<String,Object> map=new HashMap<String,Object> ();
        String[] strings=str.split("\\|");
        for(int i=0;i<strings.length;i++){
            String _k=strings[i].split("\\:")[0];
            Object value=strings[i].split("\\:")[1];
            String key=convertSetter(_k);
            map.put(key,value);
        }
        return map;
    }
//将属性设置为对应的set属性名称    eg:name->setName
    public static String convertSetter(String _k) throws Exception {
        if(_k==null){
            throw new Exception("_k must be not null");
        }else{
            return "set"+firstUppcase(_k);
        }
    }
//将属性的首字母大写   name->Name
    public static String firstUppcase(String k) {
        int length=k.length();
        return k.substring(0,1).toUpperCase()+(length>1?k.substring(1):"");
    }
    
    //设置属性。通过Class对象获取set方法,一旦与map中的key匹配,就设置相应的对象相应的属性值(value).
    public static Object setPropertities(Object target,Map map) throws IllegalAccessException, InstantiationException, InvocationTargetException {
        Class pclass=Person.class;
        Person person=(Person)pclass.newInstance();
        Method[] methods=pclass.getDeclaredMethods();
        Set<String> set=map.keySet();
        for(Method m:methods){
            String methodName=m.getName();
            if(map.containsKey(methodName)){
                Object value=map.get(methodName);
                m.invoke(person,value);
            }
        }
        return person;
    }
}

结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值