Java 内省机制

一、内省机制概述

​ Java 中的反射机制是通过名称得到类的方法和对象的成份,对于一切 Java 类都是适用的,但是有时候使用起来比较麻烦。而 JavaBean 是一种特殊的 Java 类,遵守 JavaBean 的规范,即所有的成员都是私有成员,且每个成员都有公开的读取和设定的方法(getter 和 setter),且这些方法都遵守命名的规范。就是因为 JavaBean 有这些的特性,sun 推出了一种专门对 JavaBean 成员进行访问的技术,方便对其的访问,就是内省技术。

​ 即:通过内省机制(自省机制)可以获取和操作 JavaBean 中的成员信息(方法,事件和属性)。.

JavaBean 规范:

什么是 JavaBean:符合某些设计规范的类。使用 JavaBean,可避免代码重复问题,起到功能重复使用。

1)类必须使用public修饰

2)必须保证有公共无参数的构造器

3)包含属性(property)的操作手段(getter/setter方法)

JavaBean包含的成员:method方法、event事件或property属性

1、内省和反射有什么区别?

​ 反射 (Reflect) 是在运行状态把 Java 类中的各种成分映射成相应的 Java 类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。

​ 内省 (IntroSpector) 是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。内省机制是通过反射来实现的

2、内省机制的作用

用于查看和操作 JavaBean 中的属性:

1)获取 JavaBean 中的每一个属性名 / 属性类型

2)通过 getter 方法获取属性值,通过 setter 方法给属性设置值

3、内省机制中使用到的核心几个类,列举几个常用方法,具体查看 API

1)java.beans.Introspector 类

​ Introspector 相当于一个工具类,提供了一种标准的工具来了解目标 JavaBean 支持的属性,事件和方法,即一系列取得 Bean 信息的方法。

getBeanInfo(Class beanClass)

内省 Java Bean 并了解其所有属性,暴露的方法和事件。

2)java.beans.BeanInfo 接口

​ beanInfo 接口是对一个 Bean 的描述,可以通过它取得 Bean 内部的信息。

getEventSetDescriptors()

返回 bean 定义此 bean 触发的事件类型的事件描述符。

3)java.beans.PropertyDescriptor 类

​ PropertyDescriptor 类是对一个 Bean 属性的描述,它提供了一系列对 Bean 属性进行操作的方法。

getPropertyType()

返回属性的 Java 类型信息。

java.beans.FeatureDescriptor 类是 PropertyDescriptor,EventSetDescriptor 和 MethodDescriptor 等的常见基类 (父类)。

它支持一些可以为任何内省描述符设置和检索的常见信息

getName()

获取此功能的编程名称。

二、demo

public class User {

private Long id;

private String username;

private Integer age;

private Long account;

public User() {

}

getter,setter,toString 方法

}

1、通过内省机制获取 JavaBean 属性值和属性设值

@Test

public void testIntrospector() throws Exception {

User user = User.class.newInstance();

user.setId(111L);

// 获取JavaBean的描述对象BeanInfo

//BeanInfo beanInfo = Introspector.getBeanInfo(User.class); // 包含父类的,比如:getClass()

BeanInfo beanInfo = Introspector.getBeanInfo(User.class, Object.class); // 不包含父类的

// 获取JavaBean中所有属性的描述器对象PropertyDescriptor

PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

for (PropertyDescriptor pd : pds) {

// 获取当前属性的名称

String name = pd.getName();

if("id".equals(name)){

// 调用getter方法,获取属性值

Object value = pd.getReadMethod().invoke(user);

System.out.println(value); // 111

}

if("username".equals(name)){

// 获取当前属性的数据类型

Class> propertyType = pd.getPropertyType();

System.out.println(propertyType); //class java.lang.String

// 调用setter方法,设置属性值

pd.getWriteMethod().invoke(user,"赵云");

}

if("age".equals(name)){

pd.getWriteMethod().invoke(user,17);

}

}

System.out.println(user); //User{id=null, username='赵云', age=17, account=null}

}

2、JavaBean 与 Map 之间的相互转换

//JavaBean对象转Map

public Map bean2map(Object bean) throws Exception {

Map map = new HashMap<>();

BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(), Object.class);

PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

for (PropertyDescriptor pd : pds) {

String name = pd.getName();

Object value = pd.getReadMethod().invoke(bean);

map.put(name,value);

}

return map;

}

//Map转JavaBean对象

public T map2bean(Map map, Class clazz) throws Exception {

T t = clazz.newInstance();

BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);

PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

for (PropertyDescriptor pd : pds) {

Object value = map.get(pd.getName());

pd.getWriteMethod().invoke(t,value);

}

return t;

}

@Test

public void testChange() throws Exception {

User user = new User();

user.setUsername("赵云");

user.setAge(17);

Map map = bean2map(user);

System.out.println(map); // {id=null, account=null, age=17, username=赵云}

map.put("account",1000L);

Class userClass = User.class;

User user1 = map2bean(map, userClass);

System.out.println(user1);// User{id=null, username='赵云', age=17, account=1000}

}

总结:

​ 1、使用内省机制对 JavaBean 属性进行操作还是很复杂的,一些第三方组织封装了某些工具类来方便开发者使用,如:

org.apache.commons.beanutils.BeanUtils 是 apache 封装的工具类,用来解决使用内省机制繁琐的问题,包含了挺多方法。

使用时要导入两个包:commons-beanutils-xx.jar 和 commons-logging-xx.jar。

​ 2、将 Java 的反射以及内省应用到程序设计中去可以大大的提供程序的智能化和可扩展性。有很多项目或者框架都是采取这两种技术来实现其核心功能。比如 Struts2,SpringMVC。

​ 这些框架只要在. action 中,或者 controller 方法的形参处,引入 JavaBean 就可以实例化这个 JavaBean 的值,并且可以获得表单提交的数据,那么它究竟是怎么得到的呢?

​ 其实就是 request.getParameterMap() 获取得到表单提交来的所有键值对,只不过框架内部封装了,然后框架内部利用内省,将数据封装到 JavaBean 中。

3、Java 的反射以及内省机制重点掌握,查阅框架源码时多加留意,理解其中的设计重构封装等思想

java的 内省机制_Java 内省机制相关推荐

  1. 哪些类用来实现java反射机制_JAVA反射机制

    运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的"反射"机 ...

  2. java心跳机制_Java 心跳机制实现 DOM

    心跳机制 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 大部分CS的应用需要心跳机制.心跳机制一般在Server和Client都要实现,两者实现原理 ...

  3. java tcp 心跳机制_java 心跳机制

    心跳机制:就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开. 心跳包 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定 ...

  4. java的自省机制_JAVA内省(自省)机制 ( Introspector , BeanInfo, PropertyDescriptor )

    目的和作用: 通过内省,获取和操作javaBean中的成员信息(方法,事件,属性). ------------------内省使用的核心类(接口)-------------------– Java.b ...

  5. java的 内省机制_Java内省机制

    转自: https://blog.csdn.net/hahalzb/article/details/5972421 1.java内省机制其实通俗的理解为,对自身的进行一个扫描,这个扫描的对象就是我们普 ...

  6. Java内省用法_java内省机制及PropertyUtils使用方法

    反射 相对而言,反射比内省更容易理解一点.用一句比较白的话来概括,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术.例如我们可以通过类 名来生成一个类的实例:知道了方法名,就可以调用这个方法 ...

  7. java内省和反射机制_Java内省和反射机制三步曲之 - 内省

    经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java的反射和内省机制,希望对大家有点帮助,也希望大家提出不同的看法! 1).内省(Introspector)是 Java 语言对 Bean 类 ...

  8. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  9. java异常详细讲解_Java异常处理机制的详细讲解和使用技巧

    一起学习 1. 异常机制 1.1 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 1.2 ...

最新文章

  1. 获取weblogic上指定文件的路径 java_项目部署到WebLogic文件路径访问不正确
  2. 在JSP页面中显示List集合·
  3. 北邮OJ 1027. 16校赛-Archer in Archery
  4. ABAP system landscape和vue项目webpack构建的一种实践
  5. shell:判断一个进程是否存在
  6. 我的手绘2013.01.27
  7. 当下的互联网时代,“急功近利”不是坏事
  8. RabbitMQ的基础知识与使用
  9. python36安装opencv3.2_Python3.5.3下配置opencv3.2.0的操作方法
  10. [51nod1106]质数检测
  11. 根据卫星运动矢量计算轨道六根数
  12. educoder1-2Python 计算思维训练——公式计算
  13. 塑源码是什么_朔源码燕窝就没有问题货吗?朔源码和非朔源码燕窝该如何选择?...
  14. python学习日志3--ARIMA时间序列模型预测
  15. 银河麒麟操作系统离线安装nginx
  16. python ndarray 与 base64 互转 接口传递ndarry
  17. 分类器的不同的性能评价指标
  18. RR RC 隔离级别
  19. 小敏利用计算机设计了一个计算程序,七年级上期中练习卷2013-2014第一学期定稿(10页)-原创力文档...
  20. 哈工大计算机学院奖学金,【逆天了】哈工大研究生补贴/奖学金一览表,原来读研福利这么好...

热门文章

  1. 注册地址从零开始学建站-域名篇
  2. 如何实现英文翻译成中文?英文翻译成中文简单方法介绍
  3. 前台CSS样式使用小结
  4. 网页自动弹窗被拦截 html,JS弹出新窗口被拦截的解决方法
  5. 关于 某讯QQ群的群文件上传和下载出现错误-134 的解决方法
  6. 20190123——一气化三清 Java中介者模式
  7. 从C程序到bin文件
  8. 后端获取接口数据属性为中文JSON取值(key是中文或者数字)处理方法
  9. Xcode 更改默认版本 xcode-select
  10. Java学习笔记 算法 Algorithms Fourth Edition