起源:

Java刚开始没有现在这么火,Java成功的今天,完全是因为Spring的全部系列,和独有的反射机制。

起初,所有的对象都要new(),当项目越堆越大时,问题来了。

于是有了工厂模式,需要什么对象,就进行使用工厂进行生产。

后来,人们觉得,虽然对象的耦合度低了,但是,工厂的耦合度又高了。

最终,我们生产出一套机制,利用反射进行

getFields与getDeclareFields的区别:

在书写框架时,我们如果使用getDeclareFields,只能拿到类中所有成员,而不能拿到父类的

在使用getFields的时候,我们可以都拿到

解决方案:(递归打印)

public static void printAllFields(Class<?> clazz){Field[] fields=clazz.getDeclaredFields();System.out.println(Arrays.toString(fields));if(!clazz.getSuperclass().equals(Object.class)){printAllFields(clazz.getSuperclass());}}

手写一个注入:

public class UserController {private UserService userService;public UserService getUserService() {return userService;}public void setUserService(UserService userService) {this.userService = userService;}
}

//用代码进行注入userService

 @Testpublic void testField() throws Exception {UserController userController=new UserController();Class<? extends UserController> clazz=userController.getClass();
//        Field[] declaredFields=clazz.getDeclaredFields();
//        Arrays.asList(declaredFields).stream().forEach(System.out::println);Field userServiceField=clazz.getDeclaredField("userService");UserService userService=new UserService();userServiceField.setAccessible(true);userServiceField.set(userController,userService);//获取get,set的名字String name=userServiceField.getName();name=name.substring(0,1).toUpperCase()+name.substring(1,name.length());String getMethodName="get"+name;String setMethodName="set"+name;Method method=clazz.getMethod(setMethodName,UserService.class);//在userController注入userService
        method.invoke(userController,userService);System.out.println(userController.getUserService());}

//使用注解进行注入

package littlepage.test;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Autowired {
}

//开始注入

package littlepage.test;import org.junit.Test;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.stream.Stream;public class DemoTest {@Testpublic void testField() throws Exception {UserController userController=new UserController();Class<? extends UserController> clazz=userController.getClass();Stream.of(clazz.getDeclaredFields()).forEach(field->{String name=field.getName();Autowired annotation=field.getAnnotation(Autowired.class);if(annotation!=null){field.setAccessible(true);Class<?> type=field.getType();try {/*** 这个对象直接newInstance出来的* 在spring中这个bean是定义在注解或者xml中的,如何找到?*/Object object=type.getConstructor(null).newInstance();field.set(userController,object);} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}}});}
}

碎觉!明天再刷

转载于:https://www.cnblogs.com/littlepage/p/11186695.html

黄老师架构师课程笔记(一)反射相关推荐

  1. python 架构师课程_想做架构师应该怎么学习?

    阅读本文大概需要 5分钟. 昨天写的一篇,关于架构师是做什么的文章,之后就有读者在后台问起,说要想成为架构师要具备那些方面的知识,那今天就让我们一起来扒一扒. 曾经有这么个段子:甲:我已经应聘到一家中 ...

  2. 对标阿里P6+的Java架构师课程,到底是怎样的牛逼?

    现阶段很多人被表象迷惑,感觉Java的开发人员并不好找工作.一部分人就误以为市场饱和了,却没考虑到是自身能力不足,而且他们在学习的过程中往往是这样的 ↓ ↓ ↓ : 对知识点不会筛选,盲目买书看视频, ...

  3. 系统架构师学习笔记_第六章(下)_连载

    系统架构师学习笔记_第六章(下)_连载 6.3 基于 UML 的软件开发过程 6.3.1  开发过程概述 UML 是独立于软件开发过程的,能够在几乎任何一种软件开发过程中使用.迭代的渐进式软件开发过程 ...

  4. python架构师培训课程_Python从零到架构师课程 六大阶段Python高级课程+项目实战 尚学堂全方位Python课程...

    Python从零到架构师课程  六大阶段Python高级课程+项目实战 尚学堂全方位Python课程 3.JPG (31.16 KB, 下载次数: 1) 2019-9-17 23:36 上传 2.JP ...

  5. 大数据、云计算系统高级架构师课程

    大数据.云计算系统高级架构师课程 大数据.云计算系统架构师高级培训课程 链接:https://pan.baidu.com/s/1cfnNqeQ4N3K-_YJAcEEukg 提取码:bhqs

  6. 【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

    本文属于[Azure 架构师学习笔记]系列. 本文属于[Azure Data Factory]系列. 接上文[Azure 架构师学习笔记]-Azure Data Factory (3)-触发器详解-翻 ...

  7. 阿里 P9 整理出:Java 架构师“成长笔记”共计 23 版块

    阿里巴巴一位 P9 级架构师总结出的共计 23 版块的 Java 架构师"成长笔记",一经发布就受到了众多 Java 程序员同学的追捧,这份"成长笔记"涵盖了: ...

  8. java架构师什么学校好_Java架构师之路:年薪八十万的架构师课程

    原标题:Java架构师之路:年薪八十万的架构师课程 不管是开发.测试.运维,每个技术人员心里都有一个成为技术大牛的梦,毕竟"梦想总是要有的,万一实现了呢"!正是对技术梦的追求,促使 ...

  9. openstack云计算实践-老男孩架构师课程教案笔记分享

    高级架构师系列视频课程6-CentOS7.1+Openstack L版全球最新实战文档分享(上) 高级架构师系列视频课程7-CentOS7.1+Openstack L版全球最新实战文档分享(下) ht ...

  10. 架构师学习笔记(持续更新)

    1.此博客所有内容均出自于咕泡学院架构师第三期课程. 2.此博客整理了我所学习的课程的所有笔记链接. 3.此博客会持续更新新的博客链接,直到课程学习完. 4.此博客仅供参考,仅作为学习使用. 设计模式 ...

最新文章

  1. JS一起学02:函数传参、操作属性第二种方式、提取行间事件、循环、this、焦点问题、联动选择、选项卡焦点图
  2. Acwing900. 整数划分[计数类dp]:完全背包解法
  3. boost::math::filters::daubechies_scaling_filter用法的测试程序
  4. 斐波那契数与二分法的递归与非递归算法及其复杂度分析
  5. android抽屉屏幕右滑,android - Android - 使滑动抽屉从左向右滑动 - 堆栈内存溢出...
  6. java rmi 是否 必要_Java学习之路-RMI学习
  7. python收集数据程序_基于Python语言的互联网数据收集软件的设计
  8. html字符串替换src,替换html字符串中img标签src的值.
  9. 访问tomcat服务器文件路径,外置tomcat映射服务器路径以及springboot内置tomcat映射路径配置...
  10. [Yii2] 前台用户与后台用户分离
  11. PyCharm 重构(refactor)快捷键
  12. CodeBlocks下载+界面优化+创建文件+常用快捷键
  13. ClearCase Overview
  14. 把汇总报表页面生成 pdf文件方案!
  15. html文本框自动宽度,input文本框宽度自适应
  16. CTF实验找不到ssh2john
  17. obj、fbx 转 3dtiles(免费转换工具)
  18. 【思特奇杯·云上蓝桥-算法训练营】第1周:哥德巴赫分解
  19. Photoshop给图片替换蓝天白云背景
  20. 笔记:腾讯云服务器的使用

热门文章

  1. 电脑无线网络显示红叉_Maxidix Wifi Suite下载_无线网络管理软件中文版v14.5.8
  2. 拓端tecdat|GARCH(1,1),MA以及历史模拟法的VaR比较
  3. L2-2 口罩发放 (25 分)
  4. pandas.iloc, pandas.loc用法
  5. Ubuntu-安装-有道词典
  6. 代替人工批卷?基于目标检测模型的试卷自动批阅实践
  7. 2020.06.25 端午节快乐
  8. 20170825阿里在线笔试之菜鸟仓库货架格子编号
  9. mysql 5.6 同步_mysql 5.6 半同步主从安装
  10. python 设计模式 原型模式_【设计模式】——原型模式VS模板方法模式