)方法得到了GitHub实例对象(框架用动态代理的方式帮我们生成了接口的实例,后续详细说),调用对象方法得到call对象。...这里面运用了动态代理技术,动态代理方法Proxy.newProxyInstance返回的便是该接口的代理对象。...使用缓存的目的是,由于反射比较消耗性能,所以为了避免这种性能消耗,我们保证同一个接口(api)的同一个方法,只会创建一次,由于我们每次获取的接口(api)实例都是传入的class对象,而class对象是在进程内单例的...method对象,通过对method的解析,又获取了方法的注解,该方法参数的类型,该方法参数的注解。....Call 转化为T (注意和okhttp3.Call 区分开来) ,retrofit2.Call 表示的是对一个Retrofit的接口方法的调用,也就是我们举得例子 Call<List<
> getBizInfo(@Query("id") String id); } 这个接口并不是传统意义上的网络请求接口,这个接口不是用来获取数据的接口,而是用来生产对象的接口,这个接口相当于一个工厂,接口中每个函数的返回值不是网络数据...retrofit2.Call,与okhttp3.call只是引用关系。...由于动态代理是在运行时动态生成的代理类,用常规的反编译方法无法查看,一般要使用Java提供的sun.misc.ProxyGenerator.generateProxyClass(String proxyName...网络请求OkHttpCall继承的retrofit2.Call接口是为了依赖倒置解耦的,真正的网络请求是由OkHttpCall内部引用的okhttp3.call处理的,这个okhttp3.call是借道...利用工厂类开放扩展对于流程确定,但方法不能确定的,利用工厂类,对调用者开放扩展能力。
UserBean 的 Call 对象 参数有两个,分别是 String username 和 String password 与平常方法不同的是,这两个参数各自带上了 @Query("...")...生成接口对象 老样子,先看看代码 UserMgrService service = retrofit.create(UserMgrService.class); 过于简单,调用前面 retrofit...对象的 create() 方法传入接口的 class 文件即可 获得 Call 对象 由刚开始的代码我们知道 我们向服务器发送请求需要调用 call 对象的 enqueue() 方法 那么 Call...call = service.login( mAccountEdit.getText().toString(), mPasswordEdit.getText().toString()); 说白了就是,直接调用接口的相应方法...,直接调用 call 的 enqueue 方法,传入一个 Callback 接口即可 调用后系统自动释放资源,不会阻塞,等到请求结果返回时 就会自动调用 onResponse 方法,方法 里的 response
它是基于注解,提供 JSON to POJO(Plain Ordinary Java Object ,简单 Java 对象),POJO to JSON,网络请求(POST,GET, PUT,DELETE...Retrofit 虽然是一套注解形的网络请求封装库,但是它的强大在于让代码结构更给为清晰,它可以直接解析JSON数据变成JAVA对象,甚至支持回调操作,处理不同的结果。...retrofit/ github地址:https://github.com/square/retrofit 基本使用 添加依赖 在AndroidStudio的项目中,在build.gradle文件中添加以下引用...key") String key); } 注解: @GET 是get的请求方式 @Query 是接口查询的关键字 封装接口服务的包装类 这个接口服务的包装类使用了单例模式,如下: package com.loonggg.retrofitdemo...然后调用我们的请求接口方法getJokeInfoList(); 发送请求,并回调处理结果,call.enqueue(); 到这里基本结束了,是不是非常简单?赶紧试试去吧。
LruCache的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap (频繁增删、不需要排序)中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。...Retrofit主要是在create方法中采用动态代理模式实现接口方法 ,这个过程构建了一个ServiceMethod对象。...还要注意使接口分离,降低耦合,而且接口能够我们带来很大的方便。...---- 其他库 LeakCanary原理解析 lifecycleCallbacks监听Activity,onActivityDestroyed方法最终会调用RefWatcher.watch方法: 通过将...Activity包装到WeakReference(弱引用)中,弱引⽤在引⽤对象被垃圾回收之前,会将引⽤放⼊它关联的队列中。
Retrofit 前言 使用Retrofit已经一段时间了,这货挺好用的,还很特别,特别是使用接口来定义请求方式,这用法让我对它的源码很是好奇。今天就来看看源码吧......validateEagerly(标识):先不说,后面会用到 总:完成基本的配置,创建一个Retrofit对象 2.Service的创建以及接口的调用 我们创建了一个接口的实例,用于调用接口。...哈哈,这叫动态代理,可以生成接口对应的对象,之后使用这个对象调用方法时都会调用InvocationHandler中的invoke方法。...ServiceMethod的定义:把对接口中的方法的调用转化成一次HTTP调用。 (说人话...) 呃......:Call工厂,负责创建 HTTP 请求 2、callAdapter:确定返回的retrofit2.Call类型(接口定义时的返回类型,例子中的Call); 3、responseConverter
,我们现在有了retrofit,通过他的create方法就可以创建我们的接口对象了 GnakApi api = retrofit.create(GnakApi.class); 这里虽然是返回一个GnakApi...return serviceMethod.callAdapter.adapt(okHttpCall); } }); } 当然,这里不做深入的了解,我们现在就直接去调用我们的接口方法...,对吧,这里我们换一个接口,就用天气的接口 官网:https://www.juhe.cn/docs/api/id/73 通过官网我们可用得知我们的接口是这样的 http://op.juhe.cn/onebox...OK,我们用到的关键字是Field,这样去定义,然后直接调用这个方法 api.editUser(1, "liuguilin").enqueue(new Callback() {...那就是登录,登录成功后获取到user_id,再去请求用户信息,这里应该是两个请求对吧,我们先去写好接口,这里我们先用常规的方法去获取: @POST("user/login") Call<
——村上春树《斯普特尼克恋人》 安卓调用接口 首先引入依赖 implementation 'com.android.volley:volley:1.1.1' implementation 'com.squareup.retrofit2...Retrofit retrofit; public static Retrofit.Builder getRetrofitBuilder() { if (builder == null...package com.example.interfacecall.net; import com.example.interfacecall.bean.User; import retrofit2...return */ @POST("user/login") Call login(@Body User user); } } 然后调用...接口后端代码
Header 之前对 OkHttp 进行过源码分析了,那么今天就来讲讲 Retrofit 。 Retrofit 其实是对 OkHttp 进行了一层封装,让开发者对网络操作更加方便快捷。...("user") String user); } 第二步,构造出 Retrofit 对象: Retrofit retrofit = new Retrofit.Builder() .baseUrl...接着,在创建 Builder 对象并进行自定义配置后,我们就要调用 build() 方法来构造出 Retrofit 对象了。...得到 Retrofit 对象后就是调用 create(final Class service) 方法来创建我们 API 接口的实例。...使用了装饰者模式把 retrofit2.Call 又包装了一层。
上篇文章讲解了Call接口、CallAdapter接口、Callback接口、Converter接口、Platform类、ExecutorCallAdapterFactory类、HttpException...有两个,一个是需要传入Gson对象,一个不需要传入Gson对象,而这个不传入Gson对象的静态方法,其实内部也是自己直接new的一个Gson对象。...//通过调用Utils的buff()方法来获取一个ResponseBody对象,其实Utils的buff()内部调用ResponseBody.create()来获取一个ResponseBody...1、源码初读 我读源码可以获取如下信息 OkHttpCall是final的,是不允许继承的 OkHttpCall是实现的retrofit2.Call接口 有一个两个参数的构造函数,...204和205状态 6、创建一个ExceptionCatchingRequestBody对象 7、调用serviceMethod.toResponse()方法获取一个类型为T的body对象。
public String cover; //评分 public String rate; @Override public boolean equals(Object...", total=" + total + ", movies=" + movies + '}'; } } 定义接口相关...Movie> create() { return new MovieDataSource(); } } 定义一个ViewModel,把PagedList作为LiveData对象...@Query("pagesize") int pagesize ); } 定义DataSource继承于PageKeyedDataSource,在初次加载和下一页加载中调用网络请求...since, @Query("pagesize") int pagesize ); } 定义DataSource继承于ItemKeyedDataSource,getKey方法中返回实体类的唯一值
.. } 接口是引用类型 接口不仅仅是类或结构要实现的成员列表,它是一个引用类型 我们不能直接通过类对象的成员访问接口(因为接口只有方法名,没有实现,并且下文会提到显、隐式实现,会出现方法名重名 的现象...),我们只能通过把类对象强制转换成接口类型来获取指向接口的引用(类对象继承自接口,因为已经将继承类赋值给了接口的引用,所以调用对应接口的方法,会“看到”且实际调用继承类的成员),有了接口的引用,我们便可使用点号来调用接口方法...as运算符 如果我们尝试将类对象引用转换为接口的引用,若强制转换不成功则会抛出异常,as运算符可避免这个问题 a类对象引用转换为接口类型ILiveBirth IliveBirth b = a as ILiveBirth...即一个类实现了多个接口,那如何对不同接口内的方法进行调用?...我们声明不同的接口,对不同的接口进行调用,从而实现区分相同的方法名 using System; interface Ia { void PrintInfo(string a1); } interface
,并且此bean正在创建中(对象实例化前后的标记),证明出现了循环依赖 尝试从二级缓存中获取实例化但为初始化完成的半成品对象 如果二级缓存获取不到,并且此bean运行提前曝光引用 最后从三级缓存中通过工厂创建单例对象...; if (mbd == null) { // mdb此次调用传入的是空 // 尝试从缓存中获取,第一次肯定是空,下面获取成功会放入factoryBeanObjectCache缓存 object...,尽早持有对象的引用 // 将还没完全配置好的bean存入到三级缓存中供其他bean使用(暴露引用) // 这里的getEarlyBeanReference()方法,并不是在此调用,而是声明好了方法...(); 首先检查bean是否实现了InitializingBean接口,如果是的话则需要调用 afterPropertiesSet方法(初始化方法) 再从RootBeanDefinition中获取initMethod...throws Throwable { // 1.首先检查bean是否实现了InitializingBean接口,如果是的话调用afterPropertiesSet方法
HTTP请求; 2、通过new Retrofit.Builde的builder构建出一个retrofit对象; 3、使用retrofit.create获取该网络接口请求实例; 4、由请求接口实例返回一个...下面分析下总结的几点: 1、创建一个接口来进行HTTP请求,这就是写一个API接口类来存放所需要实现的服务端接口类。...,在该方法中我们的converterFactories添加了一个 BuiltInConverters对象,我们知道converterFactories是处理HTTP返回结果进行 类型转换或者将HTTP...分析了Builder的构造后终于可以进入到builder构造方法构建出一个Retrofit对象了。...最后通过callInit.enqueue方法进行真正发送网络请求,通过OkHttp代码片段可以 可以看到,请求成功的时候,会调用parseResponse得到一个我们需要的Response类型对象
,如果其中有一个返回非null,则终止后续回调,然后直接调用BeanPostProcessor#postProcessAfterInitialization(Bean初始化完成回调接口),则表示整个Bean...,则注入相关对象 * 2.遍历后置处理器,调用实现的postProcessBeforeInitialization方法, * 3.如果实现了InitialzingBean,调用实现的..., bean); return null; }, getAccessControlContext()); } else { /** * 如果实现了Aware接口,就对该bean进行一些设置...* 比如实现了BeanNameAware接口,那么对其bean的属性beanName上set上对应的beanName。...* 如果实现了BeanFactoryAware接口,那么对其beanFactory属性设置上创建该bean使用的bean工厂。
Retrofit和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit 把REST API返回的数据转化为Java对象方便操作。同时还封装了网络代码的调用。...Call里面的bean要和服务器返回的接口一一对应,否则这个字段就会为null,甚至网络请求失败报错json转化异常。.../login") Call> doLogin(@Query("email") String email, @Query("password") String pwd...,所以就有了它: import java.net.ConnectException; import java.net.SocketTimeoutException; import retrofit2....,onFailure()方法里面则是网络有问题会走该回调。
目录 使用场景 尝试过的办法 1. “=”赋值 2. 使用.putAll()方法 3....Map中的引用对象还是都被改变了;这里就是开头说到的,这两个方法只能修改基本数据类型的,如果是引用类型不行,这两个方法是浅拷贝!...} result.reinitialize(); // 清空map result.putMapEntries(this, false); // 可见,和putAll调用了同一个接口...#但是看倒数第二组,更改引用数据类型的时候,发现new_map的值也变化了,所以putAll并没有对old_map产生深拷贝。...(下方提供自定义clone方法源码) #上述的工具类,可以实现对象的深拷贝,不仅限于HashMap,前提是实现了Serlizeable接口。
对象存在循环引用的情况下,默认会抛出异常,即不支持对被代理后的bean对象的循环引用。...// 若没有被循环引用,getEarlyBeanReference()不执行 所以remove方法返回null,所以就进入if执行此处的创建代理对象方法 //只有在不存在循环引用的条件下,才会进入if...当然没问题,之所以会有这个疑惑,是因为对动态代理底层不够了解,cglib动态代理和jdk动态代理在生产代理对象的时候,是需要获取到目标对象引用的,这个引用和后面被经过属性赋值和初始化阶段的bean引用是同一个...,然后再方法被调用的时候,是会去调用内部保存的目标对象方法的,因此最终访问的是同一个对象,没得问题。...如果没有产生循环引用,getEarlyBeanReference方法没被调用,那么postProcessAfterInitialization就会尝试返回代理对象 代理对象底层的拥有的目标对象和原始
例如保证跳转指令不会跳转到方法体以外的字节码指令上。 符号引用验证:在解析阶段中发生,保证可以将符号引用转化为直接引用。...解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符 7 类符号引用进行 初始化 到初始化阶段,才真正开始执行类中定义的 Java 程序代码,此阶段是执行 ...对应场景是:使用 new 实例化对象、读取或设置一个类的静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法。...对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。 当初始化类的父类还没有进行过初始化,则需要先触发其父类的初始化。...将 class 文件二进制数据放入方法区内,然后在堆内(heap)创建一个 java.lang.Class 对象,Class 对象封装了类在方法区内的数据结构,并且向开发者提供了访问方法区内的数据结构的接口
---- 提示:以下是本篇文章正文内容,下面案例可供参考 一、命令模式(Command Pattern) 命令模式属于行为型模式,它尝试将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化...二、使用步骤 角色 1、抽象命令(Command) 定义命令的接口,声明命令执行的方法; 2、具体命令(Concrete Command) 命令接口实现对象,需要维持对接收者的引用,并调用接收者的功能来完成命令要执行的操作...CreateInvoice(); } } 这是发票开具命令,由于基类维持了对调用者的引用,所以在Action方法中通过调用CreateInvoice方法来开具一张发票。...PrintInvoice(); } } 这是发票打印命令,由于基类维持了对调用者的引用,所以在Action方法中通过调用PrintInvoice方法来打印一张发票。...这时我们需要在ActiveMQManager类中维持对命令基类的引用,并在收到不同的JSON数据时解析出相应命令和命令参数信息,然后执行命令中的Action方法。