上一篇:属性自动赋值实现思路 | 带你学《Java语言高级特性》之九十
【本节目标】
本节需要掌握需要通过反射进行指定类对象的实例化处理,进行内容的设置(Field属性类型、方法名称、要设置的内容)。
单级属性配置
对于此时的Emp类中会发现所给出的数据类型都没有其他的引用关联了,只是描述了Empty本类的对象,所以这样的设置称为单级设置处理,所以此时应该处理两件事情:
- 需要通过反射进行指定类对象的实例化处理;
- 进行内容的设置(Field属性类型、方法名称、要设置的内容);
反射与简单Java类
1、定义StringUtils实现首字母大写功能
class StringUtils {
public static String initcap(String str) {
if (str == null || "".equals(str)) {
return str;
}
if (str.length() == 1) {
return str.toUpperCase();
}else {
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
}
}
2、定义BeanUtils工具类,该工具类主要实现属性的设置。
class BeanUtils{ //进行Bean处理的类
private BeanUtils(){}
/**
* 实现指定对象的属性设置
* @param obj 要进行反射操作的实例化对象
* @param value 包含有指定内容的字符串,格式"属性:内容|属性:内容"
*/
public static void setValue(Object obj,String value){
String results [] = value.split("\\|");//按照"|"进行每一组属性的拆分
for (int x = 0; x < results.length; x ++) { //循环设置属性内容
//attval [0]保存的是属性名称,attval [1]保存的是属性内容
String attval [] = results[x].split(":"); //获取“属性名称”和内容
try {
Field field = obj.getClass().getDeclaredField(attval[0]); //获取成员
Method setMethod = obj.getClass().getDeclaredMethod("set" + StringUtils.initcap(attval [0]), field.getType());
setMethod.invoke(obj, attval [1]); //调用setter方法设置内容
}catch (Exception e) {}
}
}
}
3、ClassInstanceFactory负责实例化对象并且调用BeanUtils类实现属性内容的设置。
class ClassInstanceFactory{
private ClassInstanceFactory(){}
/**
* 实例化对象的创建方法,该对象可以根据传入的字符串结构:"属性:内容|属性:内容"
* @param clazz 要进行反射实例化的Class对象,有Class就可以反射实例化对象
* @param value 要设置给对象的属性内容
* @return 一个已经配置好属性内容的Java对象
*/
public static <T> T create(Class<?> clazz,String value){
// 如果要想采用反射进行简单Java类对象属性设置的时候,类中必须要有无参构造
try {
Object obj = clazz.getDeclaredConstructor().newInstance();
BeanUtils.setValue(); //通过反射设置属性
return (T) obj; //返回对象
}catch (Exception e) {
e.printStackTrace(); //如果此时真的出现了错误,本质上抛出异常也没用
return null;
}
}
}
即使类中的属性再多,那么也可以轻松的实现setter的调用(类对象实例化处理)。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学