Day14_75_反射(reflect)

反射

  • 反射的基本概念

    • 反射是由Smith在1982年首次提出,主要是指程序可以访问,检测,修改它本身状态或行为的一种能力。并且能够根据自身行为的状态或结果,调整和修改所描述行为的状态和相关语义。

    • java 中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装配,无需再组件之间进行源码链接,反射允许我们的代码在编写或执行时,使我们的程序能够接入装载到jvm中类的内部信息,而不是源代码中
      选定的类协作代码,这使反射成为构建灵活的应有的主要工具,但是如果使用不到会适得其反。

  • 以下是反射机制中的类和对象:

      - java.lang.Class                    Class c = new Class();              Class类代表整体 包含:构造器方法 属性 修饰符 方法
    
      - java.lang.reflect.Constructor      Constructor = new Constructor();    构造器
    
    • java.lang.reflect.Field Field f = new Field(); 属性

    • java.lang.reflect.Method Method = new Method(); 方法

    • java.lang.reflect.Modifier Modifier = new Modifier(); 修饰符

  1. 反射机制的作用?

    • reflect 机制可以进行反编译 : .class-->.java

    • reflect 机制可以访问java 对象的属性、方法、构造方法等。

  2. 反射机制的两个缺点

    • 性能问题,使用反射基本上是一种解释操作,我们可以告诉jvm我们希望作什么,并且让它满足我们的要求,用于字段和方法接入时反射要远慢于直接代码,性能问题的程度取决于程序中如何使用反射,如果它用于程序运行中很少
      涉及的部分,影响较小。

    • 使用反射会模糊程序内即将要发生的事情,程序员希望在程序代码中看到程序的逻辑,反射等绕过源代码的技术会带来维护问题,反射需要使用在正真正增加灵活性的地方

  3. 反射机制的应用

    • 获取class类型对象的三种方式
    • forName(String className) 方法: 返回带有给定字符串名或接口相关联的class对象

        // Class类型c1的内存地址指向堆中的对象,该对象代表employee.class整个类
      
        Class c1=Class.forName("com.shige.day06.reflect.employee");  // 必须加包名
      
    • java.lang.Object.getClass() 方法: 返回此Object的运行时类。任何一个对象都有该方法(成员方法需引用)

           employee e= new employee();
      

      Class c2=e.getClass(); // c3为此 Objict 的运行时类。

    • java中每个类都有class属性,可直接赋值

           Class c3 = employee.class;   //c2 代表整个employee.class文件
      

    // 第一种方式 Date类

     Class c5=Class.forName("java.util.Date");
    

    // 第二种方式 Date类

     Class c4= Date.class;
    

    // 第三种方式 Date类

      Date d=new Date();
      Class c6=d.getClass();
    
posted @ 2021-04-09 13:02  失昼  阅读(66)  评论(0)    收藏  举报