1.概念定义

Java 反射机制(Reflect)容许程序在运行时加载、探知、使用编译期间完全未知的 class,核心类 java.lang.Class。

通过把指定类中各种元素映射成 java.lang.reflect 反射包中的相应类,使得我们可以动态的调用类成员.比如构造方法、成员方法、成员变量等。

Java  内省机制(IntroSpector)是对 JavaBean 属性、事件的一种默认处理方法,核心类 java.beans.BeanInfo。

通过 java.beans 包下一套 API 来访问 javaBean 的 getter/setter方法。

2.JDK API 使用例子

        //JDK 反射API
public static Class<?> forName(String className) //通过配置灵活加载不同数据库驱动
Class.forName(driver);

运行时获取任意类的成员方法:

        Class<String> stringClass = String.class;
//获取声明的所有方法(不包括继承方法)
Method[] methods = stringClass.getDeclaredMethods();
//获取所有方法
Method[] methods1 = stringClass.getMethods();
//获取特定方法
Method indexOf = stringClass.getMethod("indexOf", int.class);

运行时获取任意类的成员变量:

        //获取所有类属性
Field[] fields = stringClass.getFields();
//获取声明的所有成员属性(不包括继承属性)
Field[] declaredFields = stringClass.getDeclaredFields();
//获取特定字段
Field hashField = stringClass.getDeclaredField("hash");

运行时调用任意类的方法:

        Constructor<String> constructor = stringClass.getConstructor(String.class);
String newInstance = constructor.newInstance("orson");
Object invoke = indexOf2.invoke(newInstance, "n");

在运行时实例化对象并访问对应字段比直接 new 一个对象来操作到底有什么好处?

最主要的是提高灵活性和可扩展性, Spring 托管类、Struts 请求映射 Action、Hibernate 填充实体属性这些过程,反编译源码你都会看到反射。

通过修改配置中类文件的“描述”,不需要修改代码和编译,进行动态有必要的加载。

内省基于反射实现,主要是来简化 JavaBean 的赋值与取值,如果你使用过 Struts 表单到后台 Action 字段填充核心就是内省。

        UserDTO userDTO = new UserDTO();
//内省使用 setter 方法设置特定 javaBean 属性
PropertyDescriptor userName = new PropertyDescriptor("userName", UserDTO.class);
Method writeMethod = userName.getWriteMethod();
writeMethod.invoke(userDTO,"userA"); //内省使用 getter 方法获取特定 javaBean 属性
Method method = userName.getReadMethod() ;
Object result = method.invoke(userDTO) ;

很多开源项目都对 JDK 底层反射和内省进行了封装,提供了简洁的 API 接口方便使用,如 apache-common、hutool等,这里就不赘述了。

Java 基础【18】 反射与内省的更多相关文章

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

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

  2. Java基础之一反射

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

  3. Java基础之—反射

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

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

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

  5. java基础之反射---重要

    java反射: 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)):   1:获取Class字节码文件对象的三种方式: /** ...

  6. JAVA基础知识|反射

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

  7. java基础之反射机制

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

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

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

  9. java基础篇---反射机制

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  10. Java 基础总结--反射的基本操作

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

随机推荐

  1. spring的webutils包。适用于访问httpservletrequest和httpservletresponse

    WebUtils位 于 org.springframework.web.util 包中的 WebUtils 是一个非常好用的工具类,它对很多 Servlet API 提供了易用的代理方法,降低了访问 ...

  2. vdom,diff,key 算法的了解

    <ul id='list'> <li class='item'>Item1</li> <li class='item'>Item2 </li> ...

  3. TF:Tensorflow结构简单应用,随机生成100个数,利用Tensorflow训练使其逼近已知线性直线的效率和截距—Jason niu

    import os os.environ[' import tensorflow as tf import numpy as np x_data = np.random.rand(100).astyp ...

  4. HDU 2841-Visible Trees 【容斥】

    <题目链接> 题目大意: 有一个农民,站在(0,0)点,从(1,1)点到(m,n)点每个点上有棵树,问这个农民能看到多少棵树.(如果多棵树在同一条直线上,那么他只能看到一颗) 解题分析: ...

  5. 从输入 URL 到页面加载完成的过程详解---【XUEBIG】

    从输入 URL 到页面加载完成的过程中都发生了什么事情? 这是一道经典的面试题,涉及面非常广,要答出来并不困难,当要将问题回答好却不是那么容易 过程概述 浏览器查找域名对应的 IP 地址: 浏览器根据 ...

  6. 大数据技术 - 通俗理解MapReduce之WordCount(三)

    上一章我们编写了简单的 MapReduce 程序,掌握这些就能编写大多数数据处理的代码.但是 MapReduce 框架提供给用户的能力并不止如此,本章我们仍然以上一章 word count 为例,继续 ...

  7. vs各种版本

    文件名称 文件大小 百度网盘下载 微软官方下载 Visual Studio 2015 Enterprise - 企业版 - 简体中文 3.89GB http://pan.baidu.com/s/1bn ...

  8. POJ.2175.Evacuation Plan(消圈)

    POJ \(Description\) \(n\)个建筑物,每个建筑物里有\(a_i\)个人:\(m\)个避难所,每个避难所可以容纳\(b_i\)个人. 给出每个建筑物及避难所的坐标,任意两点间的距离 ...

  9. BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)

    BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...

  10. 英语口语练习系列-C30-生日-年历的周日和月份-如果白昼落进

    词汇-生日-birthday 生日庆祝 birthday celebration birth noun UK /bɜːθ/ US /bɝːθ/ the time when a baby or youn ...