Retrofit框架分析(二):注解、反射以及动态代理,Retrofit框架动态代理的源码分析
Retrofit框架分析(二):反射、泛型以及动态代理,手写Retrofit框架
-
注解是什么,为什么出现
-
反射是什么,为什么出现
2.1. 使用反射实现ButterKnife的一个小功能:为TextView赋值
-
动态代理,和Retrofit有什么关系?
-
Retrofit框架动态代理的源码分析
一、注解是什么,为什么出现
在注解出现之前,我们进行一些信息配置,都是采用XML 配置文件,这种比较繁琐、容易与代码不同步。注解出现以后,才来的的好处:
- 简化配置
- 减少样板代码
- 运行时动态处理
注解是 Java 5 引入的一种元数据(metadata)机制,用于为代码元素(类、方法、字段等)添加结构
化信息。这些信息本身不直接影响代码逻辑,但可以被编译器、开发工具或运行时框架读取和处理。
注解单独本身没有什么作用,需要搭配其他功能来使用,比如反射。
二、反射是什么,为什么出现
一般情况下,我们使用某个类时必定知道它是什么类是用来做什么的,并且能够获得此类的引用。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。
String name = new String()
反射则是一开始并不知道我要初始化的类对象是什么自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK提供的反射 API进行反射调用。反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。是Java被视为动态语言的关键。
类似于现实生活:
- X光机:不拆开物体即可观察内部结构(反射不修改代码即可分析类)。
- 镜子:通过镜像观察自身(反射对象获取类的元数据)。
为什么要学习反射
,一方面是主流的框架(如Retrofit、ButterKnife)底层大量依赖反射,如果不了解,那么我们无法知道他们是如何实现的;一方面,如果我们要写出可移植性的代码,给别人用的代码,那么反射是我们必须掌握的知识。
2.1 使用反射实现ButterKnife的一个小功能:为TextView赋值
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyId {int value();
}
@Retention(RetentionPolicy.RUNTIME):必须保留到运行时才能通过反射获取。
@Target(ElementType.FIELD):使用在变量上。
@MyId(R.id.tv_myid)
TextView tvMyid;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_back);//反射进行赋值。ButtId.init(this);tvMyid.setText("您年的是否啊手动阀手动阀士大夫阿斯蒂芬阿斯蒂芬阿斯蒂芬