当前位置 博文首页 > 托马斯-酷涛的博客:二十六、JavaSE----反射

    托马斯-酷涛的博客:二十六、JavaSE----反射

    作者:[db:作者] 时间:2021-09-08 23:04

    反射:

    ????????反射是Java中一个非常重要同时也是一个高级特性,基本上Spring等一系列框架都是基于反射的思想写成的。Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法;对于任意 一个对象,都能够知道调用它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为 java语言的反射机制。

    Java反射机制主要提供了以下这几个功能:

    • 在运行时判断任意一个对象所属的类
    • 在运行时构造任意一个类的对象
    • 在运行时判断任意一个类所有的成员变量和方法
    • 在运行时调用任意一个对象的方法

    ????????反射就像是一个掌控全局的角色,不管程序怎么运行,使用者都能够知道你这个类有哪些属性和方法,这个对象是由谁调用的,反射的优点显而易见。

    下面是一个典型的反射类

    ?与Java反射有关的类主要有

    Class类

    ????????在Java中,每定义一个java class实体都会产生一个Class对象。也就是说,当我们编写一个类, 编译完成后,在生成的.class文件中,就会产生一个Class对象,这个Class对象用于表示这个类的类型信息。Class中没有公共的构造器,也就是说Class对象不能被实例化。

    其中Class类包括的方法有:

    toString()

    ?????????toString()方法能够将对象转换为字符串,toString()首先会判断Class类型是否是接口类型,也就是说,普通类和接口都能够用Class对象来表示,然后再判断是否是基本数据类型,这里判断的都是基本数据类型和包装类,还有void类型。

    类型有如下几种:

    • java.lang.Boolean :代表boolean数据类型的包装类
    • java.lang.Character:代表char数据类型的包装类
    • java.lang.Byte:代表byte数据类型的包装类
    • java.Iang.Short:代表short数据类型的包装类
    • java.lang.Integer:代表int数据类型的包装类
    • java.lang.Long:代表long数据类型的包装类
    • java.lang.Float:代表float数据类型的包装类
    • java.lang.Double:代表double数据类型的包装类
    • java.lang.Void:代表void数据类型的包装类

    getName()

    ????????这个方法返回类的全限定名称。

    • 如果是引用类型,比如 String.class.getNameQ -> java. lang. String
    • 如果是基本数据类型byte.class.getNameO -> byte

    • 如果是数组类型new Object[3]).getClass().getName()?-> [L java. lang.Object]

    forName()

    ????????根据类名获得一个Class对象的引用,这个方法会使类对象进行初始化。

    例如 Class t = Class. forName(" java. lang.Thread")就能够初始化一个 Thread 线程对象

    getClassLoader()

    ????????获取类加载器对象。

    getDeclaredMethods()

    ????????获得该类所有方法

    Field类

    ????????Field类提供类或接口中单独字段的信息,以及对单独字段的动态访问。

    equals(Object obj)

    ????????属性与ob j相等则返回true

    get(Object obj)

    ????????获得obj中对应的属性值

    set(Object obj, Object value)

    ????????设置obj中对应属性值

    Method

    invoke(Object obj, Object... args)

    ????????传递object对象及参数调用该对象对应的方法

    ClassLoader

    ????????反射中,还有一个非常重要的类就是ClassLoader类,类装载器是用来把(class)装载进JVM 的。ClassLoader使用的是双亲委托模型来搜索加载类的,这个模型也就是双亲委派模型。

    ClassLoader的类继承图如下:

    ?

    cs