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反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
随机推荐
- maven多环境发布.
需要设定profile和build <profiles> <profile> <id>develop</id> <properties> & ...
- WebService中方法的重载
阅读目录 一:WebService中的方法是否允许重载? 二:为什么WebService中不支持方法的重载? 三:如何解决WebService中方法的重载? 一:WebService中的方法是否允许重 ...
- goto语句的升级版,setjmp,longjmp
我们知道goto语句是不能跳过函数的,但是在我么C语言的应用中,在不使用汇编的情况下,遇到需要跳出深层循环比如检错机制的时候,有确实想要跨函数跳转,有没有上面办法可以做到呢? 这就是今天要讲的两个库函 ...
- 将目录下面所有的 .cs 文件合并到一个 code.cs 文件中,写著作权复制代码时的必备良药
将目录下面所有的 .cs 文件合并到一个 code.cs 文件中,写著作权复制代码时的必备良药 @echo off echo 将该目录下所有.cs文件的内容合并到一个 code.cs 文件中! pau ...
- iOS增加pch预加载文件
1.) 打开你的Xcode工程. 在Supporting Files目录下,选择 File > New > File > iOS > Other > PCH File ...
- jsp传给java属性,java生成json串,方便以后取出来
前台代码 $.ajax({ url : '<%=basePath%>userorderother/canUpdateCust.do', type : 'POST', data: {'kdc ...
- 解决mysql group by和count同时使用的问题
例如这样一个表,我想统计email和passwords都不相同的记录的条数 CREATE TABLE IF NOT EXISTS `test_users` ( `email_id` ) unsigne ...
- filezilla server老提示connect server
地址设置成127.0.0.1即可 端口14147 密码为空(也可能是string未测试) 上次登录的默认路径:C:\Users\admin\AppData\Roaming\FileZilla Serv ...
- webstorm 设置jsp支持ZenCoding
setting -> File Type - html 里面增加*.jsp
- 【转】c#的逆向工程-IL指令集
转载自:http://www.cnblogs.com/davyjiang/articles/1337400.html 一些 IL 语言解释: 跳转指令集合Beq 如果两个值相等,则将控制转移到目标指令 ...