案例:
* 需求:写一个:“框架”,不能改变该类的任何代码的前提下,可以帮外卖创建任意类的对象,并且执行其中任意方法
* 实现:
1、配置文件
2、反射
·* 步骤:
1、将需要创建的对象的全类名和需要的执行的方法定义在配置文件中
2、在程序中加载读取配置文件
3、使用反射技术来加载类文件进内存
4、创建对象
5、执行方法
前提: 不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法
public static void main {
//1,加载配置文件
// 1、创建Properties对象
Properties pro = new Properties();
//1.2 加载配置文件,转换为一个集合
//1.2获取配置文件
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);
//2.获取配种文件中定义的数据
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
//3.加载该进内存
Class cls = Class.forName(className);
//3.创建对象
Object obj = cls.newInstance();
//5.获取方法对象
Method method = cls.getMethod(methodName);
//6、执行方法
method.invoke(obj);
/**
利用反射获取类的方式:
1 Class.forName("全类名"): 将字节码文件加载进内存,返回class对象
2 类名.class : 通过类名的属性clas获取
3 对象.getClass(): getClass()方法在Object类中定义着
*/
}
pro.properties
className=全类名
methodName=方法名
集合遍历反射进行赋值
/**
*
* @param list 入参类型字段属性必须包含:creatorCode、creatorName,对creatorName进行赋值
* @param <Object>
*/
@SneakyThrows
public <Object> void setUserNameByList(List<Object> list) {
if (CollectionUtil.isEmpty(list)){
return;
}
// 确认需要查询的用户,统计code
List<String> userCodeList = new ArrayList<>();
for (Object obj : list) {
Field creatorCode = getFieldByClass(obj,"creatorCode");
Field creatorName = getFieldByClass(obj,"creatorName");
if (creatorCode == null || creatorName == null) {
return;
}
creatorCode.setAccessible(true);
String realValue = (String) creatorCode.get(obj);
if (realValue !=null) {
userCodeList.add(realValue);
}
}
// 赋值
List<UserSimpleListVo> R = remoteUserService.listUser();
if (R != null && CollectionUtil.isNotEmpty(R)){
for (Object obj : list) {
Field creatorCode = getFieldByClass(obj,"creatorCode");
Field creatorName = getFieldByClass(obj,"creatorName");
creatorCode.setAccessible(true);
creatorName.setAccessible(true);
String realValue = (String) creatorCode.get(obj);
if (realValue !=null) {
for (UserSimpleListVo f : R)) {
if (realValue.equals(f.getUserCode())){
creatorName.set(obj,f.getName());
break;
}
}
}
}
}
// 返回该对象的指定字段,包括父类中的字段
private Field getFieldByClass( Object object,String fieldName) {
Field field = null;
for (Class clazz = object.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
field = clazz.getDeclaredField(fieldName);
} catch (Exception e) {
// 获取不到对应字段,就去父类查找,直到都查不到退出
}
}
return field;
}
}