• java中的反射机制


    反射

    动态获取类的信息以及动态调用对象的方法称为Java的反射Reflection机制。
    反射提供了封装程序集、模块和类型的对象。在Java运行时环境中,对于任意一个类的对象,可
    以通过反射获取这个类的信息。

    反射的作用
    Java反射机制允许程序在运行时透过Reflection APIs取得任意一个已知名称的class的内部信息,包括 modifiers(如public、static等)、superclass(如Object)、实现的interfaces(如Serializable)、fields(属性)和methods(方法)(但不包括methods定义),可于运行时改变fields的内容,也可调用methods
    优点: 
    在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
     缺点:
     - 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射
     - 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
    反射的用途
      - 反编译:`.class-->.java`
      - 通过反射机制访问java对象的属性,方法,构造方法等
      - 当在使用IDE,比如Ecplise时,当输入一个对象或者类,并想调用他的属性和方法是,一按点号,编译器就会自动列出他的属性或者方法,这里就是用到反射。
     - 反射最重要的用途就是开发各种通用框架。比如很多框架Spring都是配置化的(比如通过XML文件配置Bean),为了保证框架的通用性,可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象。

    在JDK中,主要由以下类实现Java反射机制
     - Class类:代表一个类
     - Field类:代表类的成员变量(属性)
     - Method类:代表类的方法
     - Constructor类:代表类的构造方法
     - Array类:提供了动态创建数组,以及访问数组元素的静态方法;
    以上类中,Class类在java.lang包,其余位于java.lang.reflect包。
    java.lang.Object类(所有类的超类)定义了getClass()方法,任意一个Java对象都可以通过此方法获得它的class。

    Class类是Reflection API中的核心类,主要有以下方法:

     - getName():获取类的名字,例如java.util.Date
     - getFields():获取类中public类型的属性,自定义或者从父类种继承
     - getDeclaredFields():获取类的所有属性(包括public、protected、default、private),只能获取到当前类种定义,不能获取父类继承的。 
     - getMethods():获取类中public类型的方法
     - getDeclaredMethods():获取类的所有方法
     - getMethod(String name,Class[] parameterTypes):获取类的指定方法,name:指定方法的名字,parameterType:指定方法的参数类型
     - getDeclaredMethod
     - getConstrutors():获取类中public类型的构造方法
     - getDeclaredConstructors()
     - getConstrutor(Class[] parameterTypes):获取类的指定构造方法,parameterTypes:指定构造方法的参数类型
     - getDeclaredConstructor
      - newInstance():通过类的public不带参数的构造方法创建该类的一个对象;
    在访问私有属性和私有方法时,需要对访问的私有属性或方法设置setAccessible(true)使被反射的类抑制java的访问检查机制。否则会报IllegalAccessException异常。

  • 相关阅读:
    简述什么是迭代器(Iterator)?
    Activiti7审批流
    面经-蔚来一面2022.11.04
    瞬态抑制二极管TVS的工作原理?|深圳比创达电子EMC(下)
    极客日报:微信回应在后台反复读取用户相册;淘特将接入微信支付;Facebook为一周两次宕机道歉
    竞赛 深度学习 大数据 股票预测系统 - python lstm
    迈向数字化发展新阶段,某商业银行数据存储创新方案及实践经验
    webpack性能优化配置与实战(一)
    K8s Runtime从Docker修改为Containerd实践
    群辉 NAS 配置 iSCSI 存储
  • 原文地址:https://blog.csdn.net/m0_56627229/article/details/126878231