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 和我一起启程...

【java基础】从反射开始(Reflection)的更多相关文章

  1. 黑马程序员:Java基础总结----反射

    黑马程序员:Java基础总结 反射   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 反射 反射的基石:Class类 Class类代表Java类,它的各个实例对象又分别 ...

  2. 黑马程序员——JAVA基础之反射

      ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! -------     Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态 ...

  3. java基础(十一 )-----反射——Java高级开发必须懂的

    本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...

  4. Java基础之一反射

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))   一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...

  5. Java基础之—反射

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))   一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...

  6. 【Java基础】反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

  7. JAVA基础知识|反射

    一.理解反射 1.1.基础概念 反射:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为ja ...

  8. 【Java基础】反射

    反射 反射的概述 反射(Reflection)是被视为动态语言的关键,反射机制允许程序在执行期借助 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性和方法. 加载完类 ...

  9. Java基础之反射总结

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  10. java基础之反射机制

    一.概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

随机推荐

  1. java删除字符串最后一个字符的几种方法

    偶然看到的,记录一下,以免忘记 字符串:string s = "1,2,3,4,5," 目标:删除最后一个 "," 方法:    1.用的最多的是Substri ...

  2. Django路由配置系统、视图函数

    一.路由配置系统(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个 ...

  3. Django(wsgiref、jinja2模块使用介绍)

    day60 wsgiref比较稳定 """ 根据URL中不同的路径返回不同的内容--函数进阶版 返回HTML页面 让网页动态起来 wsgiref模块版 "&qu ...

  4. 扩展中国剩余定理(扩展CRT)详解

    今天在$xsy$上翻题翻到了一道扩展CRT的题,就顺便重温了下(扩展CRT模板也在里面) 中国剩余定理是用于求一个最小的$x$,满足$x\equiv c_i \pmod{m_i}$. 正常的$CRT$ ...

  5. 平衡二叉树(AVL)的理解和实现(Java)

    AVL的定义 平衡二叉树:是一种特殊的二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.从平衡二叉树的名字中可以看出来,它是一种高度平衡的二叉排序树.那么什么叫做高度平衡呢?意思就是要么它 ...

  6. J01-Java IO流总结一 《异常捕获》

    下面演示java中处理I/O操作时的异常的正确方式,总结自书籍,书名忘啦~ 先看一种不正确的方式 方式一: import java.io.FileInputStream; import java.io ...

  7. 【原创】Team Foundation Server 域环境迁移

    先说下此片博客的上下文:部门所在的业务被集团出售,因此我们所有的计算机和服务器都得重新命名,退出当前域加入新公司的域.对于PC和其他服务器,目前不存在太大问题.但是对于Team Foundation ...

  8. Java学习之路(十二):IO流

    IO流的概述及其分类 IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流(读写数据)     输出流(写数据) 流按操作 ...

  9. winrar 命令行 解压文件

    1,最简单的压缩命令:winrar a asdf.txt.rar asdf.txt a的意思是进行压缩动作,后面第一个参数是被压缩后的文件名,后缀当然是rar了,最后面 的参数就是要被压缩的文件名 2 ...

  10. 分区助手里如何从临近盘(如D盘)抽取一定的空间给已经快满了的盘(如E盘)(博主推荐)(图文详解)

    不多说,直接上干货! 分区助手是什么?(博主推荐)(图文详解) 分区助手各版本比较(图文详解) 分区助手官网使用教程(专业版.绿色版和WinPE版)(图文详解) 安装分区助手时出现“分区助手已安装到你 ...