代码如下:
package bac.fangshe;
import java.lang.reflect.Method;
/**
* @author bac
* 通过反射执行set方法
*/
public class Settertest {
public static void main(String[] args) throws Exception {
Foo foo = new Foo();
setField(foo, "name", Foo.class, String.class,"wjb");
setField(foo, "age", Foo.class, Integer.class,12);
setField(foo, "handsome", Foo.class, Boolean.class, true);
System.out.println(foo.getName());
System.out.println(foo.getAge());
System.out.println(foo.getHandsome());
}
/**
* @Description 通过属性名设置对象中该属性的值
* @author bac
* @version 2018年1月2日 下午7:44:34
* @param object 需要设置属性的对象
* @param fieldName 属性的名称
* @param objectType 需要设置属性的对象的数据类型
* @param fieldType 属性的数据类型
* @param value 属性的值
* @throws Exception
* 补充一下此处用到的泛型知识:
* 此处的泛型的作用是:约束
* 方式声明的第一个 ‘<T>’为使用泛型的声明 ,方法签名中的‘Class<T>’和‘T’配合使用,限制了value参数的类型。
* 即:如果Class<T>为 Interger , 则value必须传入一个Interger的对象
*/
public static <T> void setField(Object object,String fieldName,Class<?> objectType,Class<T> fieldType,T value) throws Exception{
Method m1 = objectType.getMethod("set"+changeFirstCharToUpper(fieldName), fieldType);
m1.invoke(object, value);
}
//将第一个字母转化为大写
private static String changeFirstCharToUpper(String data){
if(data == null || data == ""){
return "";
}
String firstChar = data.substring(0,1);
return firstChar.toUpperCase()+data.substring(1);
}
}
class Foo{
private String name;
private Integer age;
private Boolean handsome;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getHandsome() {
return handsome;
}
public void setHandsome(Boolean handsome) {
this.handsome = handsome;
}
}
控制台输出为:
wjb
12
true
写博文时时间有点赶,暂时。。。