假设一个类中有几十个属性,如果我们通过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;
}
}
结果: