zoukankan      html  css  js  c++  java
  • 【java基础】从反射开始(Reflection)

    Java学习笔记 https://github.com/SnailDev/java-learning 和我一起启程...


    反射(Reflection)

    • 定义

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

    • 功能
    1. 只要给定类的全名,即可获取类的所用信息;
    2. 运行时获取任意一个对象所属的类对象;
    3. 运行时获取类中所有属性对象,可对其操作(包含私有属性);
    4. 运行时获取类中、父类中所有方法,可对其调用。
    • 应用

    目前主流的应用框架如Struts2、Hibernate、Spring、SpringMVC等的核心全部都是利用Java的反射机制来实现的。

    • 组成
    1. Class
    2. Constructor
    3. Field
    4. Method
    类的类型(Class)
    • 常用方法
    1. getName() 获得类中完整名称
    2. getDeclaredFields() 获取类中所有属性(含私有)
    3. getDeclaredMethods() 获取类中所有方法(含私有)
    4. getConstructors() 获取类的构造方法(不含私有)
    5. newInstance() 实例化类的对象(类的构造方法中参数需为空)
    • 获取Class对象的方式
    1. 利用Class类forName()静态方法传入一个类的全路径来返回相对应的Class对象;
    2. 将实例化的类对象转成Object对象,再通过Object对象的getClass()方法来返回对应类的Class对象;
    3. 通过类的class属性来返回类的Class对象。

          即

    1. Class.forName("要加载的类名")
    2. 对象名.getClass()
    3. 类名.class
    • 反射的大致流程
    1. 用上述三种方式之一获取特定类的Class类,即该类对应的字节码
    2. 调用Class对象的getConstructor(Class<?>... parameterTypes)获取构造方法对象
    3. 调用是构造方法类Constructor的newInstance(Object... initargs)方法新建对象
    4. 调用Class对象的getMethod(String name, Class<?>... parameterTypes)获取方法对象(用方法的参数类型唯一标识一个方法,依据:方法的重载)
    5. 调用方法对象类Method的invoke(Object obj, Object... args)方法,调用对象上相应方法
    类的构造方法(Constructor)

    类的构造函数反射类,通过getConstructors()方法可以获得类的所有构造函数反射对象数组。其中最主要的一个方法就是newInstance(),通过该方法可以创建一个对象类的实例,相当于new关键字。

    类、接口的属性对象(Field)
    • 常用方法
    1. getName() 获取属性名称
    2. getType() 获取属性类型
    3. get(Object obj) 获取obj对象中这个属性的值
    4. set(Object obj, Object value) 向obj对象中这个属性赋值value
    5. setAccessible(boolean flag) 启用/禁用访问控制权限
    • Class对象中获取Field对象
    1. Field[] getDeclareFields() 获取类中所有的属性信息(含私有)
    2. Field[] getFields() 获取类中所有的公共属性信息(即不含私有)
    类、接口的方法对象(Method)
    • 常用方法
    1. getName() 获取方法名称
    2. getReturnType() 获取方法返回类型
    3. invoke(Object obj,Obeject... args) 利用obj对象调用该方法
    4. getParameterTypes() 获取方法所有参数类型,按照顺序返回Class数组
    5. getDeclaredAnnotations() 获取方法的所有注解
    • Class对象中获取Method对象
    1. Method[] getDeclareMethods() 获取类中所有的方法信息(含私有);
    2. Method[] getMethod(String name, Class<?>... paramterTypes) 获取某个特定的方法,第一个参数为方法名称,第二个参数为方法参数的类对象(当方法具有多个参数时,传入的是Class数组;当方法参数为0个时,传入null);
    其他实践
    • 数组的反射

      • 对于元素同类型的数组,同维数组,class一样
      • 不同维的,class不同
      • 不同维的,父类都是Object,一样
      • 基本类型一维数组不能直接转换为Object[]
      • java.util.Arrays的 asList 方法留意下
    • hashCode 与内存泄漏问题

      • hashCode 一旦生成,不要变
      • 对象equals()方法返回true,则hashCode()返回要保持一致
      • 反之,equals()方法返回false, 则hashCode()不一定返回false
    • 内省(Introspector) & JavaBean

      JavaBean-是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。

      JavaBean的分类

      1. 侠义的JavaBean
        • 私有的字段(Field)
        • 对私有字段提供存取方法(读写方法)
      2. 广义的JavaBean
        • 私有的字段(Field)
        • 对私有字段提供存取方法(读写方法)
          • 数量任意的业务方法

      内省(IntroSpector)是Java语言对JavaBean 类属性、事件的一种处理方法。

      JavaBean读取属性x的值的流程:变大写、补前缀、获取方法。

        "x"-->"X"-->"getX"-->"MethodGetX" 
      
      • 简单实现 使用java.beans.PropertyDescriptor类
      • 复杂实现 使用java.beans.Introspector类,遍历getBeanInfo方法的返回值
      • 使用BeanUtils工具包
        • 字符串和整数转换(对比(PropertyUtils)
        • 属性级联操作
        • 操作map

     


    Java学习笔记 https://github.com/SnailDev/java-learning 和我一起启程...

  • 相关阅读:
    SQL
    HTTP协议
    工具命令
    安全策略
    日志与审核
    python视频教程免费下载,百度云网盘资源,全套!
    《Python基础教程(第3版)》PDF电子版百度云网盘免费下载
    老男孩Python全栈开发视频教程全套完整版!免费分享!
    Pycharm激活码分享,2020最新Pycharm永久激活码~
    老男孩Python视频教程全套完整版!无偿分享~
  • 原文地址:https://www.cnblogs.com/snaildev/p/9361820.html
Copyright © 2011-2022 走看看