上一篇我们说了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的内省操作的更多相关文章

  1. 对javabean的内省操作

    import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...

  2. 【java反射】Class类型的相关操作演练

    [一]获取范型接口的实现类的范型类型 (1)范型接口 package org.springframework.context; import java.util.EventListener; publ ...

  3. Java反射之数组的反射应用

    上一篇我们说了Java反射之成员方法的反射 这一篇我们说一说数组的反射应用,数组的有长度等属性,所以也会有相应的方法获得这些属性,这里我们不一一列举哪些方法.我们来了解反射包中的一个类----Arra ...

  4. JavaBean定义、JSP中使用以及内省操作

        Apache commons 一系列的开源工具室非常值得学习的实现. 一 JavaBean定义     JavaBean是一种可重复使用.且跨平台的软件组件.JavaBean可分为两种:一种是 ...

  5. java反射详解及说明

    首先写一个Person类: package lltse.base.reflectdemo; public class Person { private String name ="张三&qu ...

  6. JAVA中反射机制五(JavaBean的内省与BeanUtils库)

    内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...

  7. java 反射,注解,泛型,内省(高级知识点)

     Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs    取得任何一个已知名称的class的内部信息, 包括 ...

  8. Java反射 - 2(对象复制,父类域,内省)

    为什么要复制对象?假设有个类Car,包含name,color2个属性,那么将car1对象复制给car2对象,只需要car2.setName(car1.getName)与car2.setColor(ca ...

  9. 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean

    在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-lo ...

随机推荐

  1. 学习python-20191230(1)-Python Flask高级编程开发鱼书_第04章_应用、蓝图与视图函数

    视频06: 1.自动导包快捷键——默认为alt + enter 键组合          选中的字符由小写变为大写——Ctrl + Shift + U键组合 2.DataRequired()——防止用 ...

  2. python中字典以key排序,以value排序。以及通过value找key的方式

    1.sorted函数首先介绍sorted函数,sorted(iterable,key,reverse),sorted一共有iterable,key,reverse这三个参数. 其中iterable表示 ...

  3. java和javascript日期详解

    ** java,js日期转换:** <Excerpt in index | 首页摘要> java的各种日期转换 <The rest of contents | 余下全文> 日期 ...

  4. PEAKS|NovoHMM|Nover|DeepNovo|MAYUPercolator|UniprotKB|Swiss-prot|Mascot|SEQUEST|X!Tandem|pFind|MaxQuant|Msconvert|PEPMASS|LC|

    质谱仪: 质谱分析法是先将大分子电离为带电粒子,按质核比分离,由质谱仪识别电信号得到质谱图. Top-down直接得到结果是蛋白. Bottom down使用shutgun方法得到结果是肽段. 由蛋白 ...

  5. 转-web自动化测试,定位不到元素的原因及解决方案

    1.动态id定位不到元素 分析原因:每次打开页面,ID都会变化.用ID去找元素,每次刷新页面ID都会发生变化. 解决方案:推荐使用xpath的相对路径方法或者cssSelector查找到该元素. 2. ...

  6. PyTorch模型加载与保存的最佳实践

    一般来说PyTorch有两种保存和读取模型参数的方法.但这篇文章我记录了一种最佳实践,可以在加载模型时避免掉一些问题. 第一种方案是保存整个模型: 1 torch.save(model_object, ...

  7. C++中字符串的表示与转换

    转换总结 1.char*转string:可以直接赋值. 2.char[]转string:可以直接赋值. 3.char*转char[]:不能直接赋值,可以循环char*字符串逐个字符赋值,也可以使用st ...

  8. iPhoneSE2要在印度独家生产真得没戏?

    现在,关于iPhone SE2的消息层出不穷,总的来说,它是一款真实存在的手机,整体性能和iPhone5X/SE相似,大概可能差不多会加上一些"无线充电"之类的无聊功能.普通消费者 ...

  9. (七)spring+druid多数据源配置

    druid多数据源配置 一.druid简介 Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. ...

  10. Louis的「每周语文」

    说明:此专栏为Louis收录的经典语录及书影音标记,每周一更新. 成长的本质是变得复杂.当你的主观世界遇到客观世界,之间的那条沟,你掉进去,叫挫折,爬出来,叫成长. -- 语出罗振宇在奇葩说第四季的结 ...