黑马程序员Java培训和Android培训:JavaBean

本文深入探讨了JavaBean的概念及其在Java编程中的应用,详细介绍了如何使用内省API操作JavaBean,包括如何获取和设置属性,以及与Map相互转换的功能。文章通过编程实例展示了JavaBean和内省API的实用性和便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

(1)JavaBean是一种特殊的Java类,主要用于传递数据信息,JavaBean中的方法主要用于访问私有的字段,且方法名符合某种命名规则,举例如下: getAge()方法:Int getAge(){ }无参setAger()方法:void setAger(){}有参,其属性为age,属性名的命名:去掉set后,第二个字母为小写时,属性要小写,相反:如setCPU,属性为CPU,大写。

(2)一个符合JavaBean特点的类可以当作普通类一样进行使用,但把它当JavaBean用会更方便,JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省。

(3)如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,JavaBean的实例对象通常称为值对象(Value Object,简称VO,一般不传递方法)。这些信息在类中用私有字段来存储,如果读取或设置这些字段的值,则需要通过一些相应的方法来访问,JavaBean的属性是根据其中的setter和getter方法来确定的,而不是根据其中的成员变量。

(4)beanutils工具包,Apache组织开发的

编程实例及笔记:

import java.beans.BeanInfo;

import java.beans.IntrospectionException;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import org.apache.commons.beanutils.BeanUtils;

import org.apache.commons.beanutils.PropertyUtils;

 

//import org.apache.commons.beanutils.BeanUtils;

//import org.apache.commons.beanutils.PropertyUtils;

 

public class neixing {

 

      public static void main(String[] args) throws Exception {

           Fanshefile pt1 = new Fanshefile(3,5);

           String propertyName = "x";

           //"x"-->"X"-->"getX"-->MethodGetX-->

           //获得某属性的值

           Object retVal = getProperty(pt1, propertyName);

           System.out.println(retVal);

          

           Object value = 7;

           setProperties(pt1, propertyName, value);

 

           //得到属性getProperty()  相当于getX()方法  BeanUtils返回值为String

           System.out.println(BeanUtils.getProperty(pt1, "x").getClass().getName());

           //相当于seiX()方法  BeanUtils返回值为String

           BeanUtils.setProperty(pt1, "x", "9");

           System.out.println(pt1.getX());

           /*

           //java7的新特性         javabean和Map可以相互转换的

           Map map = {name:"zxx",age:18};

           BeanUtils.setProperty(map, "name", "lhm");

           */

          

           //birthday.time set值

           BeanUtils.setProperty(pt1, "birthday.time", "111");

           //get值

           System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));

          

           //setProperty() 里面的值为整数

           PropertyUtils.setProperty(pt1, "x", 9);

           //getProperty 得到的是一个整数 按其本身的类型进行操作,与BeanUtils不一样

           System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());

      }

 

      private static void setProperties(Object pt1, String propertyName,

                 Object value) throws IntrospectionException,

                 IllegalAccessException, InvocationTargetException {

           //把pt1.pt1.getClass()看成是一个javabean类型的类

           PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass());

           //javabean 类型里面有get和set方法,getWriteMethod()相当于调用了set方法

           Method methodSetX = pd2.getWriteMethod();

           //set无返回值

           methodSetX.invoke(pt1,value);

      }

 

      private static Object getProperty(Object pt1, String propertyName)

                 throws IntrospectionException, IllegalAccessException,

                 InvocationTargetException {

           /*propertyName想要得到的属性名,即x的值

            * 把pt1.pt1.getClass()看成是一个javabean类型的类,想要取得x的属性值

            * PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());

           Method methodGetX = pd.getReadMethod();//getReadMethod()相当于调用了get方法

           Object retVal = methodGetX.invoke(pt1);*/

          

           //这种方法和上面的方法一样的效果

           //BeanInfo代表了一个结果,就是把一个类当做javabean来看,看出来的结果,将看出来的结果封装在BeanInfo里面

           //Introspector.getBeanInfo()这种方法可以是 把一个类当做javabean来看,看出来的结果就是BeanInfo

           BeanInfo beanInfo =  Introspector.getBeanInfo(pt1.getClass());

           //得到的是所有的属性描述,是一个数组

           PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

           Object retVal = null;

           //遍历,增强for循环的使用

           for(PropertyDescriptor pd : pds){

                 //如果这里面的值和传进来的属性的名称一样 获得某属性的值  propertyName是传进来的值

                 if(pd.getName().equals(propertyName))

                 {

                      Method methodGetX = pd.getReadMethod();

                      retVal = methodGetX.invoke(pt1);

                      break;

                 }

           }

           return retVal;

      }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值