使用内省方式操作JavaBean
内省,英文中称作introspector。主要对javaBean进行操作,JavaBean是一个特殊的Java类,该类中方法名符合特定的规则(其实就是getXXX,setXXX),我们一般是利用get,set方法来推断属性的名称,而不是直接根据属性来获得名称,因为属性都是私有的,而get,set方法都是共有的。推断规则:如果第二个字母为小写,则首字母小写,例如:
- getAge—>age
 - setage—>age
 
由于自己根据方法名来推断属性名称非常麻烦,因此我们可以通过内省的方式来调用set,get方法,看看下面的例子:
    @Test
    public void test4() {
        Person p1 = new Person();
        Object value = "zhangsan";
        String propertyName = "username";
        try {
            // 给属性设置值
            setProperty(p1, value, propertyName);
            // 获得属性值
            System.out.println(getProperty(p1, propertyName));
        } catch (IllegalAccessException | IllegalArgumentException
                | InvocationTargetException | IntrospectionException e) {
            e.printStackTrace();
        }
    }
    private Object getProperty(Object p1, String propertyName)
            throws IntrospectionException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {
        PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,
                p1.getClass());
        Method methodGetProperty = pd1.getReadMethod();
        return methodGetProperty.invoke(p1);
    }
    private void setProperty(Object p1, Object value, String propertyName)
            throws IntrospectionException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {
        PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,
                p1.getClass());
        Method methodSetProperty = pd1.getWriteMethod();
        methodSetProperty.invoke(p1, value);
    }
Person.java
public class Person {
    private String username;
    private String password;
    private int money;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public int getMoney() {
        return money;
    }
    public void setMoney(int money) {
        this.money = money;
    }
}
使用JavaBean中提供的BeanInfo类来操作,这样略微麻烦,但也是一种实现方式:
    private Object getProperty(Object p1, String propertyName)
            throws IntrospectionException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {
        /*PropertyDescriptor pd1 = new PropertyDescriptor(propertyName,
                p1.getClass());
        Method methodGetProperty = pd1.getReadMethod();
        return methodGetProperty.invoke(p1);*/
        BeanInfo beanInfo = Introspector.getBeanInfo(p1.getClass());
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        for(PropertyDescriptor pd : pds){
            if(pd.getName().equals(propertyName)){
                Method methodGetProperty = pd.getReadMethod();
                return methodGetProperty.invoke(p1);
            }
        }
        return null;
    }
使用内省方式操作JavaBean的更多相关文章
- 使用内省的方式操作JavaBean
		
import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; im ...
 - [新手学Java]使用内省(Introspector)操作JavaBean属性
		
获取类bean中的所有属性: @Test //获取类bean中的所有属性 public void test1() throws Exception{ BeanInfo info = Introspec ...
 - 内省机制(操作javaBean的信息)
		
内省机制(操作javaBean的信息) ----是不是联想到了反射机制了哈,这两者有什么区别呢? 1.内省机制和反射机制的联系 ■ 其实内省机制也是通过反射来实现的,而反射是对一切类都适合去动态获取类 ...
 - 内省操作javabean的属性
		
import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector ...
 - java高新技术-操作javaBean
		
1. 对javaBean的简单内省操作 public class IntroSpectorTest { public static void main(String[] args) throws Ex ...
 - 内省Introspector(反射操作javaBean)
		
一:内省是一种特殊的反射,来更方便的操作javaBean对象,通过内省可以获取到类字节码的描述器, 然后解剖每一个字段,获取每个字段的读写方法,即get/set方法的反射,然后获取或者是封装bean的 ...
 - Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
		
通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...
 - Linux下用文件IO的方式操作GPIO(/sys/class/gpio)(转)
		
通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...
 - Android-Sqlite-OOP方式操作增删改查
		
之前写的数据库增删改查,是使用SQL语句来实现的,Google 就为Android开发人员考虑,就算不会SQL语句也能实现增删改查,所以就有了OOP面向对象的增删改查方式 其实这种OOP面向对象的增删 ...
 
随机推荐
- tornado异步请求非阻塞
			
前言也许有同学很迷惑:tornado不是标榜异步非阻塞解决10K问题的嘛?但是我却发现不是torando不好,而是你用错了 比如最近发现一个事情:某网 前言 也许有同学很迷惑:tornado不是标榜异 ...
 - SEH and C++ Exceptions,自定义CSeException
			
Description of CSeException CSeException class is based on CException class provided by MFC. I overw ...
 - vs2015   Xamarin.Android安装
			
原文:vs2015 Xamarin.Android安装 Xamarin.Android 安装步骤,以vs2015为例 1,安装vs2015中的跨平台项,但是安装在国内肯定失败,因为需要到谷歌下载 当我 ...
 - Listview 异步加载图片之优化篇(有图有码有解释)
			
在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...
 - listview异步加载sd卡图片
			
package com.example.gridview; import java.io.File; import java.io.FileOutputStream; import java.io.I ...
 - html表格cell合并插件
			
数据展示时需要合并部分数据自己写了一个简单插件 合并前: 合并后: 调用示例: var trs = $('table#dataList tbody tr').not('#demo').get(); v ...
 - linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数
			
linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数 ln -s /usr/local/arm/3.4.1/bin/arm-linux-gcc /usr/bin/arm-linux ...
 - BZOJ_3196_二逼平衡树_(树套树,线段树+Treap)
			
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3196 可以处理区间问题的平衡树. 3196: Tyvj 1730 二逼平衡树 Time Lim ...
 - HTTP 500 - 内部服务器错误
			
问题1 问:当调试程序出错的时候,为什么有的机器总是出现“HTTP 错误 500.100 - 内部服务器错误 - ASP 错误”,而不能显示具体的出错信息? 原因: IE浏览器设置中屏蔽掉了出错的具体 ...
 - devi into python 笔记(四)python的类
			
import 与 from ... import ...: #types只是一个包,FunctionType只是这个包里的一个函数.这里用它来演示 import types #如果要用Function ...