提起hook概念,相信大家都听说过,然后hook就是将反射和动态代理运用于Android平台源码之上的。可是,反射的应用场景缺非常广泛,注解的内容也同样需要使用反射去获取,所以反射是我们Android开发者必须要学习的知识。

##反射

#####什么是反射?

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性
简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。
Java 反射主要提供以下功能:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
  • 在运行时调用任意一个对象的方法
    重点:是运行时而不是编译时
    #####反射的运用

######获得 Class 对象

使用 Class 类的 forName 静态方法

public static Class<?> forName(String className)

直接获取某一个对象的 class

Class<?> klass = int.class;
Class<?> classInt = Integer.TYPE;

调用某个对象的 getClass() 方法

StringBuilder str = new StringBuilder("123");
Class<?> klass = str.getClass();

#####判断是否为某个类的实例

一般地,我们用 instanceof 关键字来判断是否为某个类的实例。同时我们也可以借助反射中 Class 对象的 isInstance() 方法来判断是否为某个类的实例,它是一个 native 方法:

public native boolean isInstance(Object obj);

#####创建实例

通过反射来生成对象主要有两种方式。

  • 使用Class对象的newInstance()方法来创建Class对象对应类的实例。
Class<?> c = String.class;
Object str = c.newInstance();
  • 先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例。这种方法可以用指定的构造器构造类的实例。
//获取String所对应的Class对象
Class<?> c = String.class;
//获取String类带一个String参数的构造器
Constructor constructor = c.getConstructor(String.class);
//根据构造器创建实例
Object obj = constructor.newInstance("23333");
System.out.println(obj);

#####获取构造器信息

得到构造器的方法

Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,
Constructor[] getConstructors() -- 获得类的所有公共构造函数
Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)
Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)

获取类构造器的用法与上述获取方法的用法类似。主要是通过Class类的getConstructor方法得到Constructor类的一个实例,而Constructor类有一个newInstance方法可以创建一个对象实例:

public T newInstance(Object ... initargs)

#####获取类的成员变量(字段)信息

获得字段信息的方法

Field getField(String name) -- 获得命名的公共字段
Field[] getFields() -- 获得类的所有公共字段
Field getDeclaredField(String name) -- 获得类声明的命名的字段
Field[] getDeclaredFields() -- 获得类声明的所有字段

#####调用方法

获得方法信息的方法

-- 使用特定的参数类型,获得命名的公共方法
Method getMethod(String name, Class[] params)
-- 获得类的所有公共方法
Method[] getMethods()
-- 使用特写的参数类型,获得类声明的命名的方法 # 总结上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。**很多人担心学了容易忘,这里教你一个方法,那就是重复学习。**打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。**[资料领取方式:戳这里免费领取](https://gitee.com/vip204888/java-p7)**从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。![](https://img-blog.csdnimg.cn/img_convert/74d24afd64985fa941a5b4ead0a68717.png)人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。
转存中...(img-ofhac6ob-1628135964504)]人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。

Java程序员必备!Dagger2源码分析(二(1)相关推荐

  1. java写一个简单的浪漫代码_2020浪漫七夕:7款程序员必备表白源码(超炫酷)

    2020七夕将要来临,php中文网给大家准备了七款程序员表白专用源码,让你可以一举俘获美人心,下面就来看一看这七款表白代码大全,包含html.html5.CSS.JQ编写的一些非常简单实用的表白代码, ...

  2. java写一个简单的浪漫代码,2018浪漫七夕:7款程序员必备表白源码(超炫酷)

    2018七夕将要来临,php中文网给大家准备了七款程序员表白专用源码,让你可以一举俘获美人心,下面就来看一看这七款表白代码大全,包含html.html5.CSS.JQ编写的一些非常简单实用的表白代码, ...

  3. 程序员表白简短html代码,【杂谈】2018浪漫七夕:7款程序员必备表白源码(超炫酷)...

    2018七夕将要来临,ki4网给大家准备了七款程序员表白专用源码,让你可以一举俘获美人心,下面就来看一看这七款表白代码大全,包含html.html5.CSS.JQ编写的一些非常简单实用的表白代码,非常 ...

  4. 程序员编程表达爱情php,2019浪漫情人节:8款程序员必备表白源码

    亚当表白夏娃,打开?上帝都不知道的魅力后花园.罗密欧表白朱丽叶,懂得了爱情比任何事情都值得.你也曾经表白过吧? 课桌间,将萌动的心跳化作一张表白小纸条,大学?,不经意间牵起的双手就是美好的承诺,工作后 ...

  5. 七夕编程代码linux,2020七夕情人节:7个程序员必备表白源码

    亚当表白夏娃,打开了上帝都不知道的魅力后花园.罗密欧表白朱丽叶,懂得了爱情比任何事情都值得.你曾经表白过吗? 课桌间,将萌动的心跳化作一张表白小纸条,大学时,不经意间牵起的双手就是美好的承诺,工作后, ...

  6. Java 程序员必备的 15 个框架,前 3 个地位无可动摇!

    2019独角兽企业重金招聘Python工程师标准>>> Java 程序员方向太多,且不说移动开发.大数据.区块链.人工智能这些,大部分 Java 程序员都是 Java Web/后端开 ...

  7. Java程序员必备的几款开发工具,高效才是硬道理!

    作为一名优秀的Java程序员,怎能没有几款得心应手的高效开发工具呢!市面上类库.工具千千万,下面我就给大家推荐几款高效的Java开发工具. 一.Eclipse Eclipse做为一款开发源代码的Jav ...

  8. Java程序员必备的几款开发工具

    工欲善其事,必先利其器.作为一名优秀的Java程序员,怎能没有几款得心应手的高效开发工具呢!市面上类库.工具千千万,下面就给大家推荐几款高效的Java开发工具. 1.UItraEdit UltraEd ...

  9. Java程序员必备的10个大数据框架

    当今IT开发人员面对的最大挑战就是复杂性,硬件越来越复杂,OS越来越复杂,编程语言和API越来越复杂,我们构建的应用也越来越复杂.根据外媒的一项调查报告,小千列出了Java程序员在过去12个月内一直使 ...

  10. B站疯传|200个Java程序员必备词汇

    相信很多学生在学习英语的时候都有这样那样的问题,因此也困扰着太多想要学习编程的小伙伴. 其实学习编程,常用的单词就那么多,只要把必备的单词学会,你的代码也能写的很6,编程和英语的关系就是这么简单纯粹. ...

最新文章

  1. C#进行MapX二次开发之控件基本操作
  2. 自己编写jQuery动态引入js文件插件 (jquery.import.dynamic.script)
  3. 数学建模学习笔记——蒙特卡洛模拟
  4. python 数据库 实战_干货!python与MySQL数据库的交互实战
  5. 小程序获取input 的value_[小发现] 现在可以获取任意小程序的小程序码了!
  6. IBM推全球首个5纳米芯片:计划2020年量产
  7. English trip EM2-LP-2A Around the world Teacher:Taylor
  8. Python PIL支持的图像文件格式
  9. 数据结构笔记(五)-- 循环链表的实现
  10. mock测试_【Postman】16 Postman使用mock进行挡板测试(1)
  11. 181201每日一句
  12. 【OpenDDS开发指南V3.20】第一章:介绍
  13. PPAPI nacl_sdk安装
  14. 由马斯克的Space X 火箭的主芯片程序编写语言说起
  15. win10中鼠标点右键或者重命名文件夹系统卡顿解决方法
  16. GAN介绍 - 提示与技巧
  17. 8.0时代的微信营销怎么玩,才能挖掘用户最大价值
  18. 走近求伯君1 求伯君,1964年11月26日出生于浙江新昌县。
  19. 科技公司LOGO在线制作设计
  20. 计算机语言表示教师节快乐,教师节快乐的祝福语38句

热门文章

  1. 中国水龙头市场趋势报告、技术动态创新及市场预测
  2. 水力压裂化学品行业调研报告 - 市场现状分析与发展前景预测
  3. android获取sd的大小,Android实现获取SD卡总容量,可用大小,机身内存总容量及可用大小的方法...
  4. delphi webservice 如何 共享 变量_医疗质量|如何实现非药物医嘱闭环管理?
  5. java 校验的接口中的字符必须是半角的_初识Java,笔记1
  6. 重磅上线|国内首个 Kubernetes SIG-Cloud-Provider 子项目揭秘
  7. 从入门到入土:Python requests代理 proxy配置 HTTP
  8. Lua:打印lua表
  9. 劝雷军别造车?王传福:别浪费钱和时间;华为面向全球招募天才少年:不限学历/学校;腾讯光子工作室强制不加班双休|极客头条...
  10. 滴滴定制网约车D1即将登陆长沙 市民12月中可叫到