1.复习一下基本反射获取对象属性方法
/**
* 描述 复习反射操作
* @throws ClassNotFoundException
*/
@Test
public void test() throws ClassNotFoundException {
//放射三种方式
Class<TController> clazz1 = TController.class;
Class<?> clazz2 = Class.forName("com.wjm.springcloud.controller.TController");
//第三种
TController tController = new TController();
Class<? extends TController> clazz3 = tController.getClass();
/**
* 当前对象 的上测试里面的方法
*/
//当前对象 全限定名
System.out.println(clazz3.getName());
//获取对象属性
Field[] fields = clazz3.getDeclaredFields();
for (Field f: fields) {
System.out.println("属性 : " + f.getName() +" , "+ "类型 : " + f.getType().getName() +" , " + "修饰符 : " + f.getModifiers());
}
// 对象的类型 名称
System.out.println(clazz3.getTypeName());
//获取对象方法
Method[] methods = clazz3.getMethods();
for (Method m: methods) {
System.out.println("方法名 : " + m.getName() +" , "+ "参数 : " + m.getParameters() +" , " + "修饰符 : " + m.getModifiers());
}
}
2.利用正常反射去调用方法
/**
* 描述 利用正常反射去调用方法
* @throws ClassNotFoundException
* @throws NoSuchFieldException
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
@Test
public void auto2() throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
TController tController = new TController();
TService tService = new TService();
Class<? extends TController> clazz = tController.getClass();
Field tServiceField = clazz.getDeclaredField("tService");
tServiceField.setAccessible(true);
//通过方法才能够设置具体的属性值
String name = tServiceField.getName();
name = name.substring(0,1) + name.substring(1,name.length());
String setMethodName = "set" + name;
Method method = clazz.getMethod(setMethodName, TService.class);
//反射
method.invoke(tController, tService);
System.out.println(tController.gettService());
}
3.使用注解的方式去调用反射
/**
* 描述 使用注解的方式去调用反射
* @throws ClassNotFoundException
*/
@Test
public void auto() throws ClassNotFoundException {
TController tController = new TController();
Class<? extends TController> clazz = tController.getClass();
//获取所有属性值 Lambda表达式,用流的方式
Stream.of(clazz.getDeclaredFields()).forEach(
field -> {
//获取注解的方式
AutoZR annotation = field.getAnnotation(AutoZR.class);
if (annotation != null){
field.setAccessible(true);
//当前属性类型
Class<?> type = field.getType();
try {
//创建对象 弱类型,效率低,只能调用无参构造
Object fieldType = type.newInstance();
field.set(tController,fieldType);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
);
System.out.println(tController.gettService());
}
走一个流程图
为什么要添加这么多processor?
Spring是一个框架,作为框架,首先要考虑的就是扩展性
!扩展性!可以自定义processor,来完成整个bean的实例化过
程,增强某些功能
版权声明:本文为jj89929665原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。