Java:反射

编程语言分类(以程序运行时结构及变量类型的可变性作为标准):

--|1.静态语言

--|2.动态语言:程序运行时,允许改变程序的结构及变量类型的语言;

~由此,Java、C++、C#是非动态语言,而Perl、Python、Ruby是动态语言

·Java中按照加载时机将类的加载类型划分为编译时检查类型、运行时加载类型

1.编译时检查类型的类(运行时已识别类型:RTTI--Run Time Type Identificated):编译时识别,该类型的类在编译时由编译器检查确认,在运行时加载

2.运行时加载类型(反射:主要用于构造工具):从其他地方得到一个未知类的对象,在程序运行时动态的将该未知类对象所在类文件加载到Java Virtual Machine中

---- 反射(Reflective): 能够分析类能力的程序

···反射库(Reflection Library)-丰富且精心设计的工具集,方便编写能够动态操纵Java代码的程序。这项功能被大量应用与JavaBeans中,JavaBeans为Java组件的的体系结构,在设计或运行中添加新类时,可以快速应用开发工具动态查询新添加类的能力(具体体现为获得新类的实例域及方法);

·反射机制的作用:

    1.程序运行时动态分析类的能力

    2.程序运行时动态查看对象,例如:编写一个toString方法供所有类使用

    3.实现通用的数组操作代码

    4.利用Method对象(对象类似于C++中的函数指针)

反射中的类Class、Constructor、Method


·Class类(泛型类--例如:Employee.class的类型是Class):保存对象在程序运行时的类型信息(程序运行期间,Java运行系统始终为所有的对象维护一个被称为运行时的类型标识。该信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行),一个Class对象表示一个特定类的属性

Class类中的方法:

1.public String getName(){} -- 返回类的名字



2.public static Class forName(String className){} -- 返回对应className的类的Class对象(className:类或接口的全名,即包名.类名),需处理异常:ClassNotFoundException

3.T表示任意Java类型:则T.class将代表T对应的Class类对象

4.任意对象都有的方法:public Class getClass(){} -- 返回调用该方法的对象的所属类的Class类对象

注:2、3、4为获取Class类对象的方法(以下仅针对获取Class类对象这一过程)

>其中编号为2的方法仅需要类的名字,而不需要导入包,更加具有普遍意义(反射 -- 运行时检查,处理的运行时异常为ClassNotFoundException);

>编号为3的方法需要类的名字,且需要导入相应的包(编译时检查);

>编号4的方法需要类对象且需要导入相应的包(编译时检查);



5.public Method getMethod(String methodName, Class...parametersType){} -- 返回特定方法的Method对象 

>第一个参数为方法名字,之后的参数为要获取方法的参数所在类的Class对象(以下同此格式可以此方式解释)

6.public Method[ ] getMethods(){} -- 返回Class对象指向的类中以public作为访问权限修饰符的方法

>以下同此格式可以此方式解释(实在拗口,书写不便,见谅!)

7.public Method[ ] getDeclaredMethods(){} -- 返回Class对象指向的类中的所有方法(包括protected、private修饰的方法)的Method对象的数组;

>以下同此格式可以此方式解释(实在拗口,书写不便,见谅!)

注:5、6、7为Class类中获取Class对象指向的类中的方法的方法



8.public Constructor getConstructor(Class...parameterTypes){} -- 返回Class对象中特定构造器的Constructor对象

9.public Constructor[ ] getConstructors(){} -- 返回包含Class对象中公共构造器对象的Constructor数组

10.public Constructor[ ] getDeclaredConstructors(){} -- 返回包含Class对象中所有构造器对象的Constructor数组

注:8、9、10为Class类中获取Class对象中的构造器的方法

11.public Field getField(String name){} -- 返回Class对象中的特定实例域的Field对象

12.public Field[ ] getFields(){} -- 返回包含Class对象中公共实例域对象的Field数组

13.public Field[ ] getDeclaredFields(){} -- 返回包含Class对象中所有实例域对象的Field数组

注:11、12、13为Class类中获取Class对象中的实例域的方法(因封装原理,一般getDeclaredFields(){}是无意义的)

14.public void setAccessible(boolean flag){} -- 设置访问Class对象所指向的类的私有属性权限


Method类:描述方法的类

Method类对象指向具体的方法,类似于C、C++中的函数指针;

Method类中的方法:

public void invoke(String methodName, Object...parameters){} -- 调用Method类对象所指的方法(在运行时动态调用需要的方法)


Constructor类:描述构造器的类

Constructor类对象指向具体的构造器,本质是函数,也类似于C、C++中的函数指针;

Constructor类中的方法:

public Object newInstance(Object...parameters){} -- 调用Constructor类对象所指的构造器


Field类:描述实例域的类

关于实例域(Field):

-- 封装:从形式上看封装不过是将数据和行为组合在一个包内,并对对象的使用者隐藏了行为的实现方式。对象中的数据称为实例域(instance field),这些值的集合就是这个对象的当前状态(state)。向对象发送一条消息,它的状态就有可能发生改变。

对象的主要特性:

    1.对象的行为(behavior) -- 可以对对象施加哪些操作,或可以对对象施加哪些方法

    2.对象的状态(state) -- 当施加方法时,对象如何响应

    3.对象表示(identity) -- 如何辨别具有相同行为与状态的不同对象

大致上的含义是改变数据的方式、改变后的数据代表的意义、标示相同数据的不同含义

>由此,对象即一组数据,而数据能够通过逻辑运算实现人为赋予的抽象意义!!


!·待补充 -- 动态代理

你可能感兴趣的:(Java:反射)