zoukankan      html  css  js  c++  java
  • 21.反射

    1. 什么是反射
      1. 在运行状态中,对于任意一个类,都能够知道这个类所有属性和方法
      2. 在运行状态中,对于任意一个对象,都能够调用它的任意一个方法和属性
        这种动态获取信息以及动态调用对象方法的功能即java反射机制
      3. 具体点:反射就是把java类中各个成分映射成一个个Java对象,在类装载时完成
        1. 一个类中这些成员方法、构造方法、在加入类中都有一个类来描述,通过反射实例的方法获取这些类的实例,调用它们的方法,从而使用了反射的功能
        2. 举例
          1. Constructors c = fansheStu.getConstructors();/通过反射实例的方法获取构造函数实例
          2. Stu stu = c.newInstance();//调用构造函数实例的方法创建Stu对象
    2. 反射的作用
      1. 增加程序灵活性,避免重新编码:框架中使用最多,举例如下
        1. struts2框架通过struts2.xml文件查找对应类信息及方法名,然后创建相应的实例访问相应的方法
      2. 反射被广泛地用于那些需要在运行时检测或修改程序行为的程序中。这是一个相对高级 的特性
      3. 缺点
        1. 性能第一 Performance Overhead
          反射包括了一些动态类型,所以 JVM 无法对这些代码进行优化。因此,反射操作的效
          率要比那些非反射操作低得多
        2. 内部暴露 Exposure of Internals
          由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方
          法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性
    3. 反射的使用(Class类的使用)
      1. 什么是Class
        1. Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)
        2. Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了,我们需要用到哪个Class对象,直接获取即可.
      2. 没有公共的构造方法,如何创建某个类的反射实例呢?
        1. 实例的getClass()方法
          1. 源自父类的Object的方法
        2. 类自带的静态class属性
        3. 使用Class类的静态方法:forName(String className)
      3. 常用的方法
        1. 获取构造方法实例
          1. public Constructor[] getConstructors() 返回所有"公有的"构造方法实例组成的数组
            public Constructor[] getDeclaredConstructors() 返回所有构造方法实例组成的数组(包括私有、受保护、默认、公有)
            public Constructor getConstructor(Class... parameterTypes) 获取单个的"公有的"构造方法
            public Constructor getDeclaredConstructor(Class... parameterTypes) 获取"某个构造方法"可以是私有的,或受保护、默认、公有
          2. 获取Constructor实例后常用的方法是:newInstance()创建实例(私有的构造函数实例调用此方法会抛出异常)
        2. 获取成员变量实例
          1. Field[] getFields() :获取所有的"公有字段"
            Field[] getDeclaredFields(): 获取所有字段,包括:私有、受保护、默认、公有
            public Field getField(String fieldName) :获取某个"公有的"字段
            public Field getDeclaredField(String fieldName): 获取某个字段(可以是私有的)
          2. 获取成员变量实例后常用方法是:public void set(Object obj,Object value),为某个对象的这个字段设置值(如果是私有的成员实例,调用此方法会抛异常java.lang.IllegalAccessException)
        3. 获取成员方法实例
          1. public Method[] getMethods() :获取所有"公有方法";(包含了父类的方法也包含Object类)
            public Method[] getDeclaredMethods() :获取所有的成员方法,包括私有的(不包括继承的)
            public Method getMethod(String name,Class<?>... parameterTypes) :name : 方法名;Class ... : 形参的Class类型对象,可是多个
            public Method getDeclaredMethod(String name,Class<?>... parameterTypes 获取"某个方法"可以是私有的,或受保护、默认、公有
          2. 获取成员方法实例后常用的方法是:public Object invoke(Object obj,Object... args),为某个对象调用方法(obj : 要调用方法的对象;args:调用方式时所传递的实参),私有方法不能调用
        4. 获取静态main方法实例
          1. stuClass.getMethod("main", String[].class);

          2. 方法实例调用时,obj传入null,因为它是静态的方法

      4. 反射与配置文件结合使用
      5. 通过反射越过泛型检查
    4. 说明
      1. 在运行期间,一个类,只有一个Class对象产生
      2. 获取Class三种方式常用第三种方式
        1. 第一种:对象都有了还要反射干什么呢?
        2. 第二种:需要导入类的包,依赖太强,不导包就抛编译错误
        3. 一般都第三种:一个字符串可以传入也可写在配置文件中后读取,这样程序相当灵活,可以做到不修改代码,只改配置文件(框架就这这样做的)
  • 相关阅读:
    IDEA实用教程(十一)—— 使用Maven创建JavaSE项目
    IDEA实用教程(十)—— 配置Maven的全局设置
    IDEA实用教程(九)—— 创建Servlet
    IDEA实用教程(八)—— 创建JavaWeb项目
    搭建视频解析的接口
    IDEA实用教程(七)—— IDEA的断点调试
    Elasticsearch 常用配置参数总结
    C# web api返回类型设置为json的两种方法
    asp.net MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
    CountDownLatch的使用和原理解析
  • 原文地址:https://www.cnblogs.com/River111/p/9716603.html
Copyright © 2011-2022 走看看