反射

作者: 森林中大鸟 | 来源:发表于2020-05-18 06:03 被阅读0次

    概述

    在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    反射原理
    https://www.jianshu.com/p/3ea4a6b57f87

    基本应用

    获取类对象 (有3种方式)

    Class.forName()(常用)
    Hero.class (需要导入类的包)
    new Hero().getClass()

    利用反射机制创建对象

    基本步骤
    与传统的通过new 来获取对象的方式不同反射机制,反射会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”再通过构造器对象创建一个对象,具体步骤:
    1.获取类对象 Class class = Class.forName("pojo.Hero");
    2.获取构造器对象 Constructor con = clazz.getConstructor(形参.class);
    3 获取对象 Hero hero =con.newInstance(实参);

    获取构造器对象方法:

    1).批量的方法:
    public Constructor[] getConstructors():所有"公有的"构造方法
    public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)
    2).获取单个的方法:
    public Constructor getConstructor(Class… parameterTypes): 获取单个的"公有的"构造方法
    public Constructor getDeclaredConstructor(Class…parameterTypes):获取"某个构造方法"可以是私有的,或受保护、默认、公有;

    获取成员变量并使用

    1.获取类的对象

    1. 获取属性 Field f1 = 对象.getDeclaredField("属性名")
    2. 修改属性 f1.set(h,实参),注意这里的h是对象,不是类对象

    getField和getDeclaredField的区别

    getField 只能获取public的,包括从父类继承来的字段。
    getDeclaredField 可以获取本类所有的字段,包括private的,但是 不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true));

    获取成员方法并使用

    先获取类的对象
    再获取成员方法:
    public Method getMethod(String name ,Class<?>… parameterTypes):获取"公有方法";(包含了父类的方法也包含Object类)
    public Method getDeclaredMethods(String name ,Class<?>… parameterTypes) :获取成员方法,包括私有的(不包括继承的)
    参数解释:
    name : 方法名;
    Class … : 形参的Class类型对象
    调用方法
    Method --> public Object invoke(Object obj,Object… args):
    参数说明:
    obj : 要调用方法的对象;
    args:调用方式时所传递的实参

    相关文章

      网友评论

          本文标题:反射

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