内省概述

内省(Introspector)是Java语言对JavaBean类的属性,事件和方法的默认处理方式

例如: 类User中有属性name,那么必定有getName,setName方法,内省就是通过这两个方法来获取或者设置name属性的值。

JavaBean

就是一个满足了特定格式的Java类

需要提供无参数的构造方法.

属性私有.

对私有的属性提供public的get/set方法.

内省类库

java.beans.Introspector:

该类提供了"了解目标JavaBean所支持的属性,事件和方法"的标准方式。

java.beans.BeanInfo:

该接口提供有关获取JavaBean的显式信息(公共的属性,方法,事件等)的方法。

java.beans.PropertyDescriptor:

该类描述 JavaBean的属性信息. 注意,该属性信息是通过JavaBean的get/set方法推导出的属性。

示例代码

​ 1.存在类User

public class Student {

private String name;

private int age;

public Student() {

}

public Student(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "Student [name=" + name + ", age=" + age + "]";

}

}

2.通过内省获取User类的所有属性:

public class StudentTest {

public static void main(String[] args) throws IntrospectionException {

// 通过Introspector.getBeanInfo方法获取指定JavaBean类的BeanInfo信息

BeanInfo beanInfo = Introspector.getBeanInfo(Student.class);

// 通过BeanInfo的getPropertyDescriptors方法获取被操作的JavaBean类的所有属性

// 注意,该属性是通过get/set方法推断出来的属性

PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

// 遍历所有的属性

for (PropertyDescriptor pd : pds) {

// 获取属性的名字

String propName = pd.getName();

System.out.println(propName);

// 获取属性的类型

Class propType = pd.getPropertyType();

System.out.println(propType);

// 获取属性对应的get方法

Method getMethod = pd.getWriteMethod();

System.out.println(getMethod);

// 获取属性对应的set方法

Method setMethod = pd.getReadMethod();

System.out.println(setMethod);

}

}

}

3.创建一个User对象,通过内省,设置该对象的name属性的值为"张三丰"

// 创建一个没有任何参数的Student对象s

Student s = new Student();

// 通过PropertyDescriptor类的构造方法,直接获取Student类的name属性

PropertyDescriptor pd = new PropertyDescriptor("name",Student.class);

// 获取name属性对应的set方法

Method setMethod = pd.getWriteMethod();

// 调用set方法给上边创建的s对象的name属性赋值

setMethod.invoke(s, "张三丰");

// 输出s

System.out.println(s);

4.输出结果为:

Student [name=张三丰, age=0]

应用场景

在很多JavaWeb框架设计的时候,会使用到内省机制.

如:

​ Web开发框架Struts中的FormBean就是通过内省机制来将表单中的数据映射到类的属性上.

​ BeanUtils框架的底层也是通过内省来操作JavaBean对象的.

BeanUtils

BeanUtils是一个由Apache软件基金组织编写的,专门用来操作JavaBean对象的一个工具.

主要解决的问题是:可以把对象的属性数据封装到对象中。

它的底层,就是通过内省来实现的.

// 向Map集合中封装数据 -- 模拟在javaWeb中,使用request.getParameterMap() 获取的参数数据;

Map map = new HashMap() ;

map.put("name", "张三丰") ;

map.put("age", 200) ;

// 创建一个Student对象

Student s = new Student();

// 通过BeanUtils的populate方法,可以把Map集合中的数据封装到Student中

// 该方法的底层就是通过内省来实现的

BeanUtils.populate(s, map);

扩展

内省机制是通过反射来实现的

标签:Java,name,age,内省,Student,机制,public,属性

来源: https://blog.51cto.com/14473726/2438783

java内省的意思,Java内省机制相关推荐

  1. java内省的意思,java内省机制 + 内省是什么 + 内省实现方式 + 和反射的区别

    见:https://zhidao.baidu.com/question/434288330.html.http://blog.csdn.net/u014394715/article/details/5 ...

  2. java内省的意思_java内省和反射的区别

    展开全部 经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java的反射和内e68a843231313335323631343130323136353331333363366237省机制,希望对 ...

  3. java 内省源码_java 内省

    用内省来操作Bean会给程序带来很大的便利,特别是在很大的实体对象的时候,在其属性很多的时候要为其赋值的时候, package com.bean; public class User { privat ...

  4. Java学习总结:39(反射机制)

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

  5. 【Java】反射( reflection)机制 详解

    目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...

  6. java class 生成对象_Java反射机制(创建Class对象的三种方式)

    1:SUN提供的反射机制的类: java.lang.Class java.lang.reflect.Constructor java.lang.reflect.Field java.lang.refl ...

  7. 完成这个例子,说出java中针对异常的处理机制。

    有一个类为ClassA,有一个类为ClassB,在ClassB中有一个方法b,此方法抛出异常,在ClassA类中有一个方法a,请在这个方法中调用b,然后抛出异常.在客户端有一个类为TestC,有一个方 ...

  8. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  9. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

最新文章

  1. JVM对象分配回收算法
  2. thonny python ide_学习用 Thonny 写代码:一个面向初学者的Python IDE
  3. Apache Tomcat 文件包含漏洞(CVE-2020-1938)
  4. 用NiceTool在微信浏览器中下载APP
  5. 需求调研 现有系统梳理_对速度的需求,访问现有数据的速度提高了1000倍
  6. python文件编译_编译Python文件
  7. BugkuCTF-WEB题源码
  8. c语言汉字属于什么类型_空气悬浮风机在风机中属于什么类型?
  9. Proxy 简答实现 ViewModel 和 View
  10. python文件写入_python读写不同编码txt文件
  11. 精益生产管理中如何进行库存成本控制?
  12. 【研究】英文论文阅读——英语poor的研究人员的福利
  13. 路由器静态路由配置实验
  14. Android 第三方SDK的检测与提取
  15. 六一快乐!管她几岁,快乐万岁!
  16. UOS 1050e ARM架构(linux)安装TP-LINK TL-WN823N免驱版无线网卡驱动
  17. 考研英语真题笔记 2020,Java数据结构面试题及答案
  18. linux 文件转utf 8,在Linux系统下把文件转换为UTF-8编码
  19. 考研复试计算机英文介绍,2017年考研复试计算机专业英文自我介绍.doc
  20. web阴影shadow练习

热门文章

  1. 人生,切忌不要做这些事!
  2. 传奇人物--史蒂夫 乔布斯
  3. linux欧拉强制修改root密码,openEuler 20.03 LTS安装图文教程
  4. Linux下安装Firefox flash插件
  5. linux 把所有_smal.jpeg 改成_small.jpeg
  6. css什么是自适应布局,CSS中常见的自适应布局是什么
  7. js 小数取整,js 小数向上取整,js小数向下取整
  8. 微信小程序的人工智能模型部署(flask)
  9. 乱码的原因和发展(关于编码)
  10. 用边境墙禁毒无效?墨西哥大毒枭爆料走私细节