Java反射之对JavaBean的内省操作
上一篇我们说了Java反射之数组的反射应用
这篇我们来模拟实现那些javabean的框架(BeanUtils)的基本操作。
[一] 什么是JavaBean
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,通过set和get方法获取。
一般我们根据这种方法命名规则,通过反射获得某个或者设置某个属性的时候,假如这个属性名为”x",那么,就会处理以下几步:
1、将x变为大写X,判断x后是否还有字母,有则首字母大写
2、在x前加get
[二] 对JavaBean的复杂内省操作
这是一种比较笨重的方式:
Bean类:
package club.leyvan.muzile;
public class Bean {
private int x = 10;
private int y = 20;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
测试类:
public static void main(String[] args) throws Exception {
Bean bean = new Bean();
System.out.println(getProperty(bean, "x"));
setProperty(bean, "y", 8);
System.out.println(getProperty(bean,"y"));
}
/**
* 根据属性名获得属性方法
* @param obj
* @param propertyName
* @return
* @throws Exception
*/
public static Object getProperty(Object obj,String propertyName) throws Exception{
Object retVal = null;
//通过内省获得描述对象
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
//通过描述对象获得该类的所有属性描述
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
//迭代所有属性,获得与规则相同的方法。
for(PropertyDescriptor pd : pds){
//如果该属性的名称与方法形参一致
if(pd.getName().equals(propertyName)){
//则调用该属性的get方法
Method method = pd.getReadMethod();
//get方法都是无参数的
retVal = method.invoke(obj);
}
}
return retVal;
}
/**
* 根据属性名设置属性的方法
* @param obj
* @param propertyName
* @param value
* @throws Exception
*/
public static void setProperty(Object obj,String propertyName,Object value) throws Exception{
//通过内省获得描述对象
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
//通过描述对象获得该类的所有属性描述
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
//迭代所有属性,获得与规则相同的方法。
for(PropertyDescriptor pd : pds){
//如果该属性的名称与方法形参一致
if(pd.getName().equals(propertyName)){
//则调用该属性的set方法
Method method = pd.getWriteMethod();
//set方法传入参数
method.invoke(obj,value);
}
}
}
结果:
10
8
将原本等于20的y改为了8
[三] 对JavaBean的简单内省操作
上面是一种笨拙的方式,有更为简单的方法:
public static void main(String[] args) throws Exception {
Bean bean = new Bean();
System.out.println(getProperty(bean, "x"));
setProperty(bean, "y", 39);
System.out.println(getProperty(bean,"y"));
}
public static Object getProperty(Object obj,String propertyName) throws Exception{
Object retVal = null;
//直接获得属性描述对象
PropertyDescriptor pd = new PropertyDescriptor(propertyName, obj.getClass());
//根据属性,获得get方法
Method method = pd.getReadMethod();
//调用方法
retVal = method.invoke(obj);
return retVal;
}
public static void setProperty(Object obj,String propertyName,Object value) throws Exception{
PropertyDescriptor pd = new PropertyDescriptor(propertyName, obj.getClass());
Method method = pd.getWriteMethod();
method.invoke(obj, value);
}
结果:
10
39
本期Java反射就介绍到这,谢谢大家!
Java反射之对JavaBean的内省操作的更多相关文章
- 对javabean的内省操作
import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...
- 【java反射】Class类型的相关操作演练
[一]获取范型接口的实现类的范型类型 (1)范型接口 package org.springframework.context; import java.util.EventListener; publ ...
- Java反射之数组的反射应用
上一篇我们说了Java反射之成员方法的反射 这一篇我们说一说数组的反射应用,数组的有长度等属性,所以也会有相应的方法获得这些属性,这里我们不一一列举哪些方法.我们来了解反射包中的一个类----Arra ...
- JavaBean定义、JSP中使用以及内省操作
Apache commons 一系列的开源工具室非常值得学习的实现. 一 JavaBean定义 JavaBean是一种可重复使用.且跨平台的软件组件.JavaBean可分为两种:一种是 ...
- java反射详解及说明
首先写一个Person类: package lltse.base.reflectdemo; public class Person { private String name ="张三&qu ...
- JAVA中反射机制五(JavaBean的内省与BeanUtils库)
内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...
- java 反射,注解,泛型,内省(高级知识点)
Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs 取得任何一个已知名称的class的内部信息, 包括 ...
- Java反射 - 2(对象复制,父类域,内省)
为什么要复制对象?假设有个类Car,包含name,color2个属性,那么将car1对象复制给car2对象,只需要car2.setName(car1.getName)与car2.setColor(ca ...
- 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean
在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-lo ...
随机推荐
- 漫谈2014年人机交互(CHI)大会
编者按:2014年度以人机交互为主题的顶级会议ACM SIGCHI已经落下帷幕.微软研究院在此次会议的入选论文总数仅次于卡耐基•梅隆大学,位列第二.此次会议中,有哪些创新想法或技术让人眼前一亮?听微软 ...
- 使用iframe的好处与坏处详细比拼
一.使用iframe的坏处 1.搜索引擎的蜘蛛不会识别在iframe中被调用的图片.文本.url等内容的,因为该内容不属于该页面,只是访问的时候被临时的调用,而且在SEO建议中也有提到:"f ...
- 3DSMAX安装失败,如何卸载修复重新安装3dmax 2017?
一些同学安装3dmax出错了,也有时候想重新安装3dmax的时候会出现这种本电脑已安装3dmax,你要是不留意直接安装,只会按装3dmax的附件,3dmax是不会按装上的.这种原因呢就是大家在之前卸载 ...
- [LC] 230. Kth Smallest Element in a BST
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- Nginx笔记总结十一:Nginx重写规则指南
依赖PCRE库,需要安装pcre,最多循环10次,超过后返回500错误, 1. rewrite模块指令 break:完成当前设置的重写规则,停止执行其他的重写规则 if: if () { ...
- 【转载/部分修改】超实用STL——set的入门使用
本文部分转载自他人博文,少部分自行进行了添改qwq 参考文章:https://blog.csdn.net/chaoyueziji123/article/details/38422211 作者:chao ...
- 解决jar包冲突
参考文档: http://www.jianshu.com/p/100439269148 idea plugin: https://www.cnblogs.com/huaxingtianxia/p/57 ...
- js里的null 与undefined
null 表示一个值被定义了,定义为'空值': undefined 表示没有定义. 转换为数字时 Number(undefined) === NaN Number(null) === 0 在es6使用 ...
- Stock Starer股票盯盘
一个业余小项目,用于监控指定股票的成交指标,触发事件的主动通知 源码 !https://github.com/jeffchen81/stock-starer 设计说明 场景 定时任务1:通过网上Ope ...
- L53-Maximum-Subarray
题目描述 Find the contiguous subarray within an array (containing at least one number) which has the lar ...