Java 基础【18】 反射与内省
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】 反射与内省的更多相关文章
- 黑马程序员:Java基础总结----反射
黑马程序员:Java基础总结 反射 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 反射 反射的基石:Class类 Class类代表Java类,它的各个实例对象又分别 ...
- Java基础之一反射
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...
- Java基础之—反射
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...
- java基础(十一 )-----反射——Java高级开发必须懂的
本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...
- java基础之反射---重要
java反射: 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)): 1:获取Class字节码文件对象的三种方式: /** ...
- JAVA基础知识|反射
一.理解反射 1.1.基础概念 反射:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为ja ...
- java基础之反射机制
一.概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
- 【Java基础】反射和注解
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
- java基础篇---反射机制
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- Java 基础总结--反射的基本操作
一.反射的概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
随机推荐
- 065 updateStateByKey的函数API
一:使用场景 1.应用场景 数据的累加 一段时间内的数据的累加 2.说明 每个批次都输出自己批次的数据, 这个时候,可以使用这个API,使得他们之间产生联系. 3.说明2 在累加器的时候,起到的效果和 ...
- apache利用http_referer进行防盗链
http://blog.sina.com.cn/s/blog_8729dd9801011rn1.html
- Scala-Unit6-final/type关键字、样例类&样例对象
一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...
- Pushing Boxes POJ - 1475 (嵌套bfs)
Imagine you are standing inside a two-dimensional maze composed of square cells which may or may not ...
- appium环境搭建及项目实战
手机端自动化环境搭建比其他自动化环境搭建较为复杂,安装工具有点多,也会有很多坑,安装工具一定注意版本号对应问题. 一.我的电脑环境:win7 64位,安卓测试机4.4.2版本,Python3.6,a ...
- Xamarin Essentials应用教程文件系统FileSystem
Xamarin Essentials应用教程文件系统FileSystem 文件系统用于管理设备内的各类文件.通过文件系统,应用程序可以创建永久文件和临时文件,也可以获取预先打包的文件,如预设数据库文件 ...
- C#Windows窗体界面设计_05_添加菜单栏 工具栏 状态栏 按钮
- 使用openCV打开USB摄像头(UVC 小米micro接口)
之前在AndroidStudio上就用了别人用写的库成功地打开了USB摄像头. 于是我之后又在PC上尝试了一下,首先去淘宝买了个MICRO母转USB公的转接口,然后在Qt上配置了一下OPENCV后开始 ...
- BZOJ.3591.最长上升子序列(状压DP)
BZOJ 题意:给出\(1\sim n\)的一个排列的一个最长上升子序列,求原排列可能的种类数. \(n\leq 15\). \(n\)很小,参照HDU 4352这道题,我们直接把求\(LIS\)时的 ...
- python基础一 ------可迭代类型的连接
对可迭代迭代进行连接,返回一个可迭代对象 两种方式: 并行连接 zip() 串行连接 itertools.chain from itertools import chain #并行连接 print(& ...