Java反射 Introspector
The Introspector class provides a standard way for tools to learn about the properties, events, and methods supported by a target Java Bean.
Introspector提供了一种标准的方式作为工具来获取类的属性,时间,方法。
// 类属性缓存,空间换时间private static final ConcurrentMap, PropertyDescriptor[]> classPropCache =new ConcurrentHashMap, PropertyDescriptor[]>(64);/*** 获取Bean的属性* @param bean* @return*/private static PropertyDescriptor[] getPropertyDescriptors(Object bean) {Class beanClass = bean.getClass();PropertyDescriptor[] cachePds = classPropCache.get(beanClass);if (null != cachePds) {return cachePds;}try {BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);cachePds = beanInfo.getPropertyDescriptors();classPropCache.put(beanClass, cachePds);return cachePds;} catch (IntrospectionException e) {throw new RuntimeException(e);}}/*** 获取Bean的属性* @param bean bean* @param propertyName 属性名* @return 属性值*/public static Object getProperty(Object bean, String propertyName) {PropertyDescriptor[] beanPds = getPropertyDescriptors(bean);for (PropertyDescriptor propertyDescriptor : beanPds) {if (propertyDescriptor.getName().equals(propertyName)){Method readMethod = propertyDescriptor.getReadMethod();if (null == readMethod) {continue;}if (!readMethod.isAccessible()) {readMethod.setAccessible(true);}try {return readMethod.invoke(bean);} catch (Throwable ex) {throw new RuntimeException("Could not read property '" + propertyName + "' from bean", ex);}}}return null;}/*** 设置Bean属性* @param bean bean* @param propertyName 属性名* @param value 属性值*/public static void setProperty(Object bean, String propertyName, Object value) {PropertyDescriptor[] beanPds = getPropertyDescriptors(bean);for (PropertyDescriptor propertyDescriptor : beanPds) {if (propertyDescriptor.getName().equals(propertyName)){Method writeMethod = propertyDescriptor.getWriteMethod();if (null == writeMethod) {continue;}if (!writeMethod.isAccessible()) {writeMethod.setAccessible(true);}try {writeMethod.invoke(bean, value);} catch (Throwable ex) {throw new RuntimeException("Could not set property '" + propertyName + "' to bean", ex);}}}}
Java反射 Introspector的更多相关文章
- JAVA内省(Introspector)
什么是Java内省:内省是Java语言对Bean类属性.事件的一种缺省处理方法. Java内省的作用:一般在开发框架时,当需要操作一个JavaBean时,如果一直用反射来操作,显得很麻烦:所以sun公 ...
- java 反射,注解,泛型,内省(高级知识点)
Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs 取得任何一个已知名称的class的内部信息, 包括 ...
- Java 内省 Introspector
操纵类的属性,有两种方法 反射 内省 面向对象的编程中,对于用户提交过来的数据,要封装成一个javaBean,也就是对象 其中Bean的属性不是由字段来决定的,而是由get和Set方法来决定的 pub ...
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...
- Java 反射和内省实现spring的IOC和DI
1.构造两个JavaBean package com.spring.model; public class People { private Car car; public Car getCar() ...
- java反射知识点总结
一.java反射基础 1.1 什么叫java反射? 答:程序运行期间,动态的获取类的基本信息.比如:创建对象,调用类的方法,获得类的基本结构.这样给程序设计提供了很大的灵活性.个人总结就是:根据动态需 ...
- Java反射之对JavaBean的内省操作
上一篇我们说了Java反射之数组的反射应用 这篇我们来模拟实现那些javabean的框架(BeanUtils)的基本操作. [一] 什么是JavaBean JavaBean 是一种JAVA语言写成的可 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
随机推荐
- 为什么不能使用Executors.newFixedThreadPool和newCachedThreadPool
newFixedThreadPool的阻塞队列大小是没有大小限制的,如果队列堆积数据太多会造成资源消耗.newCachedThreadPool是线程数量是没有大小限制的,当新的线程来了直接创建,同样会 ...
- 【转】MySQL中information_schema是什么
大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个information_schema数据库. information_schema数据库是做什么用的呢,使用WordPress博客 ...
- IntelliJ IDEA maven库下载依赖包速度慢的问题
Reference: https://blog.csdn.net/qq1501340219/article/details/54638158 在pom.xml中添加maven 依赖包时,我就发现不管是 ...
- vi/vim使用进阶: 文件浏览和缓冲区浏览
原文:https://blog.easwy.com/archives/advanced-vim-skills-netrw-bufexplorer-winmanager-plugin/ 本节所用命令的帮 ...
- Scrum卡片层次图
对照国内的项目管理软件禅道,可以好好感受一下,何为Scrum. 看板则一定要是实物,才有感觉.
- Maven项目编译后classes文件中没有.xml问题
在做spring+mybatiss时,自动扫描都配置正确了,却在运行时出现了如下错误.后来查看target/classes/.../dao/文件夹下,发现只有mapper的class文件,而没有xml ...
- flume中HdfsSink参数说明
flume到hdfsSink: type hdfs path 写入hdfs的路径,需要包含文件系统标识,比如:hdfs://namenode/flume/webdata/ 可以使用flume提供的日期 ...
- Ubuntu下Eclipse中文乱码解决
把Windows下的工程导入到了Linux下Eclipse中,由于以前的工程代码,都是GBK编码的(Windows下的Eclipse 默认会去读取系统的编码,所以Widnwos下的Eclipse的编码 ...
- Spring配置文件<context:property-placeholder>标签使用漫谈
<context:property-placeholder>标签提供了一种优雅的外在化参数配置的方式,不过该标签在Spring配置文件中只能存在一份!!! 众所周知,Spring容器是采用 ...
- JQ 点击指定文本框显示div。点击其他区域隐藏DIV
<input id="username" type="text" style="width:90%;margin-top: 40px;" ...