• 笔记整理:反射


        反射
            反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,容许程序在运行时加载、探知、使用编译期间未知的class。即java的反射机制可以加载一个运行时才得知名称的class,获得其完整结构。
    (反射就是运行时可以得到某个对象的所有信息,包括方法,类型,属性,方法参数,方法返回值以及可以调用该类的所有方法。)
            在程序运行期间,java运行时系统始终为所有对象维护一个被称为运行时的类型标识。
            获取类的Class对象的方法:
            

    调用getClass()

    Object类中的getClass()方法返回一个Class类型的实例)

    Boolean var1 = true;Class<?> classType2 = var1.getClass();System.out.println(classType2);输出:class java.lang.Boolean 

    运用T.class 语法

    (T是任意的Java类型)

    Class<?> classType4 = Boolean.class;System.out.println(classType4);输出:class java.lang.Boolean 

    运用static method Class.forName()

    (使用时应该提供异常处理器)

    Class<?> classType5 = Class.forName("java.lang.Boolean");System.out.println(classType5);输出:class java.lang.Boolean 

    运用primitive wrapper classesTYPE 语法

    (这里返回的是原生类型,和Boolean.class返回的不同)

    Class<?> classType3 = Boolean.TYPE;System.out.println(classType3);输出:boolean 




    反射的应用
    1:通过反射获取构造方法并使用
    //获取字节码文件对象
    Class c = Class.forName("cn.itcast.Person");

    //获取构造器对象
    Constructor con = c.getDeclaredConstructor(String.class,int.class);

    //通过构造器对象获取Person对象
    Object obj = con.newInstance("刘意",29);

    2:通过反射获取成员变量并使用
    //获取字节码文件对象
    Class c = Class.forName("cn.itcast.Person");

    //获取构造器对象
    Constructor con = c.getDeclaredConstructor(String.class,int.class);

    //通过构造器对象获取Person对象
    Object obj = con.newInstance("刘意",29);


    //获取成员变量
    Field field = c.getDeclaredField("name");
    field.setAccessible(true);
    field.set(obj,"刘大意");



    3:通过反射获取成员方法并使用
    //获取字节码文件对象
    Class c = Class.forName("cn.itcast.Person");

    //获取构造器对象
    Constructor con = c.getDeclaredConstructor(String.class,int.class);

    //通过构造器对象获取Person对象
    Object obj = con.newInstance("刘意",29);

    //获取所有公共方法对象,包括从父类继承的
    //(获取本类所有方法的时候,不包括从父类继承的)
    Method[] methods = c.getDeclaredMethods();
    for(Method m : methods){
    m.setAccessiable(true);
    m.invoke(obj, null);
    }

























  • 相关阅读:
    BZOJ3670:[NOI2014]动物园(KMP)
    415. [HAOI2009] 旅行
    U10223 Cx大帝远征埃及
    U10206 Cx的治疗
    2741. [济南集训 2017] 掰巧克力
    复习题目汇总 over
    7-20 表达式转换(25 分)
    7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)
    7-18 银行业务队列简单模拟(25 分)
    7-17 汉诺塔的非递归实现(25 分)(有待改进)
  • 原文地址:https://www.cnblogs.com/istarry/p/3ca80e75f68ad50dfed39f7c2788773f.html
Copyright © 2020-2023  润新知