Dagger2源码分析(二):Java无所不能的反射在Android中需要熟练的知识

  

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

反射

<编辑>什么是反射吗?

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

<李>

在运行时判断任意一个对象所属的类;

<李>

在运行时构造任意一个类的对象,

<李>

在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用私人方法),

<李>

在运行时调用任意一个对象的方法
重点:<强>是运行时而不是编译时

<编辑>反射的运用 获得类对象

使用类类的forName静态方法

公共静态Class<?比;forName(字符串名称)

直接获取某一个对象的类

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

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

StringBuilder str=new StringBuilder (“123”);   Class<?比;klass=str.getClass (); <编辑>判断是否为某个类的实例

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

公共本机布尔isInstance(对象obj); <编辑>创建实例

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

<李>

使用类对象的newInstance()方法来创建类对象对应类的实例。

Class<?比;c=String.class; str=c.newInstance对象(); <李>

先通过类对象获取指定的构造函数对象,再调用构造函数对象的newInstance()方法来创建实例。这种方法可以用指定的构造器构造类的实例。

//获取弦所对应的类对象Class<?比;c=String.class;//获取字符串类带一个字符串参数的构造器的构造函数构造函数=c.getConstructor (String.class);//根据构造器创建实例   对象obj=constructor.newInstance (“23333”);   System.out.println (obj); <编辑>获取构造器信息

得到构造器的方法

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

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

公共T newInstance(对象……initargs) <编辑>获取类的成员变量(字段)信息

获得字段信息的方法

字段getField(字符串名称)——获得命名的公共字段   场[]getFields(),获得类的所有公共字段   场getDeclaredField(字符串名称)——获得类声明的命名的字段   场[]getDeclaredFields(),获得类声明的所有字段 <编辑>调用方法

获得方法信息的方法

——使用特定的参数类型,获得命名的公共方法方法getMethod(字符串名称、类[]params)——获得类的所有公共方法方法[]getMethods ()   ——使用特写的参数类型,获得类声明的命名的方法   方法getDeclaredMethod(字符串名称,类[]参数)   ——获得类声明的所有方法   方法[]getDeclaredMethods ()

当我们从类中获取了一个方法后,我们就可以用调用()方法来调用这个方法.invoke方法的原型为:

Dagger2源码分析(二):Java无所不能的反射在Android中需要熟练的知识