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反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
随机推荐
- 服务端测试环境hosts配置检查脚本
[本文出自天外归云的博客园] 问题 由于A测试环境和B测试环境相互耦合,B测试环境切换导致我方测试环境需要更改后台服务器的响应配置.若多台服务器中有一台服务器没有更改配置,则在测试过程中将会出现问题. ...
- python中如何使用requests模块下载文件并获取进度提示?
Reference: https://www.zhihu.com/question/41132103 #!/usr/bin/env python3 import requests from conte ...
- CentIOS PHP 扩展库
1.GD库 yum -y install php-gd
- golang深度获取子节点
起因 需要在树形结构里获取子树,树形结构一般是存储一维数组,数组元素里存储子节点的指针 代码 package main import ( "errors" "fmt&qu ...
- Java 数据库中文变成问号???解决办法
在连接的URL地址后面加上: url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 于是在正式 ...
- [转]cron表达式详解
原文地址:https://www.cnblogs.com/linjiqin/archive/2013/07/08/3178452.html Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6 ...
- 【Visual Studio】项目的引用显示黄色叹号
情况一:个别引用的DLL显示黄色叹号. 通常是因为该DLL需要的.Net Framework版本与当前项目使用的版本不兼容.如该DLL需要的版本高于当前项目使用的版本.考虑修改项目的.Net Fram ...
- C语言 · 日期计算
算法提高 日期计算 时间限制:1.0s 内存限制:256.0MB 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰 ...
- BMP位图文件格式详解及编程建议
BMP文件渊源流长,虽然对JPG.PNG等格式图像文件来说,确实有点土,但是毕竟BMP文件格式相对简单,容易理解,至于BMP众多的位图格式也不能责怪微软,主要是早期谁也没料到图片技术会发展的这么快,而 ...
- python 基础笔记
1,去掉了C语言中的大括号,用空格来对齐语句块.(空格一般用2个或4个,但没有限制) 2,要在py文件代码中使用中文,需要在第一行加入下面的代码: # -*- coding: utf-8 -*- 或者 ...