【Android架构师java原理详解】二;反射原理及动态代理模式

前言;

本篇为Android架构师java原理专题二;反射原理及动态代理模式java


大公司面试都要求咱们有扎实的Java语言基础。而不少Android开发朋友这一块并非很熟练,甚至半路初级底子很薄,这给咱们进阶形成了很大的困扰,很容易就碰到瓶颈。若是咱们想提高成为高级工程师甚至架构师,java基础必定要学好面试

一.反射(Reflect)

反射之中包含了一个「反」字,因此了解反射咱们先从「正」开始。性能优化

通常状况下,咱们使用某个类时一定知道它是什么类,是用来作什么的。因而咱们直接对这个类进行实例化,以后使用这个类对象进行操做。markdown

反射则是一开始并不知道我要初始化的类对象是什么,天然也没法使用 new 关键字来建立对象了。这时候,咱们使用 JDK 提供的反射 API 进行反射调用。反射就是在运行时才知道要操做的类是什么,而且能够在运行时获取类的完整构造,并调用对应的方法。架构

Reflection(反射)是Java被视为动态语言的关键,反射机制容许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操做任意对象的内部属性及方法。oop

Java反射机制主要提供了如下功能:性能

  • 在运行时构造任意一个类的对象
  • 在运行时获取任意一个类所具备的成员变量和方法
  • 在运行时调用任意一个对象的方法(属性)

Java 是一门面向对象的语言。在面向对象的世界里,万事万物皆对象,既然万事万物皆对象,那么咱们的类是否是对象呢?学习

咱们写的每个类均可以当作一个对象,是 java.lang.Class 类的对象。每个类对应的Class放在哪里呢?当咱们写完一个类的Java文件,编译成class文件的时候,编译器都会将这个类的对应的class对象放在class文件的末尾。优化

里面都保存了些什么?你们能够理解保存了类的元数据信息,一个类的元数据信息包括什么?有哪些属性,方法,构造器,实现了哪些接口等等,那么这些信息在Java里都有对应的类来表示。spa

Class类

Class是一个类,封装了当前对象所对应的类的信息

一个类中有属性,方法,构造器等,好比说有一个Person类,一个Order类,一个Book类,这些都是不一样的类,如今须要一个类,用来描述类,这就是Class,它应该有类名,属性,方法,构造器等。Class是用来描述类的类。

Class类是一个对象照镜子的结果,对象能够看到本身有哪些属性,方法,构造器,实现了哪些接口等等
对于每一个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。

对象只能由系统创建对象,一个类(而不是一个对象)在 JVM 中只会有一个Class实例

获取Class对象的三种方式;
  1.经过类名获取 类名.class
  2.经过对象获取 对象名.getClass()
  3.经过全类名获取 Class.forName(全类名)

二.动态代理

代理模式和静态代理
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来说代理模式就是咱们生活中常见的中介。

举个例子来讲明:张三想买某种用品,虽然他能够本身去找,可是这确实太浪费时间和精力了,或者很差意思去买。因而张三就经过中介Mark来买,Mark来帮张三,张三只是负责选择本身喜欢的的size,而后付钱就能够了。

目的:
(1)经过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的没必要要复杂性
(2)经过代理对象对原有的业务加强;

代理模式通常会有三个角色:


抽象角色:指代理角色和真实角色对外提供的公共方法,通常为一个接口

真实角色:须要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。也就是真正的业务逻辑在此。

代理角色:须要实现抽象角色接口,是真实角色的代理,经过真实角色的业务逻辑方法来实现抽象方法,并能够附加本身的操做。将统一的流程控制都放到代理角色中处理!

而访问者再也不访问真实角色,而是去访问代理角色。

静态代理在使用时,须要定义接口或者父类,被代理对象与代理对象一块儿实现相同的接口或者是继承相同父类。通常来讲,被代理对象和代理对象是一对一的关系,固然一个代理对象对应多个被代理对象也是能够的。

静态代理,一对一则会出现时静态代理对象量多、代码量大,从而致使代码复杂,可维护性差的问题,一对多则代理对象会出现扩展能力差的问题。


三.动态代理

是指在使用时再建立代理类和实例

优势

只须要1个动态代理类就能够解决建立多个静态代理的问题,避免重复、多余代码

更强的灵活性

缺点

效率低,相比静态代理中 直接调用目标对象方法,动态代理则须要先经过Java反射机制 从而 间接调用目标对象方法

应用场景局限,由于 Java 的单继承特性(每一个代理类都继承了 Proxy 类),即只能针对接口 建立 代理类,不能针对类建立代理类。

在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler接口、另外一个则是 Proxy类,这个类和接口是实现咱们动态代理所必须用到的。

InvocationHandler接口是给动态代理类实现的,负责处理被代理对象的操做的,而Proxy是用来建立动态代理类实例对象的,由于只有获得了这个对象咱们才能调用那些须要代理的方法。

四.总结

以上主要为概念介绍,建议先理解基础概念后再去学习原理与实现,原理详解视频也能够分享给你们,有兴趣的朋友记得本身去理解其中原理,而且动手去写源码,依靠复制粘贴是永远不会有大的成长的

五.BAT主流Android架构技术大纲+学习路线+全套视频;

架构技术详解和学习路线与资料分享都在博客这篇文章里;《BATJ一线大厂最主流的Android高级架构技术;体系详解+学习路线》
(包括自定义控件、NDK、架构设计、混合式开发工程师(React native,Weex)、性能优化、完整商业项目开发等)

  • 阿里P8级Android架构师技术脑图;
  • 全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记
相关文章
相关标签/搜索