美文网首页
Java:反射

Java:反射

作者: Spect | 来源:发表于2018-01-20 18:11 被阅读0次

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

    --|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<Employee>):保存对象在程序运行时的类型信息(程序运行期间,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:反射

          本文链接:https://www.haomeiwen.com/subject/qxtbnxtx.html