黑马程序员技术交流社区

标题: 【求教】如何设置javabean中某几个属性的默认值 [打印本页]

作者: 不喝茶的陆羽    时间: 2013-6-8 13:30
标题: 【求教】如何设置javabean中某几个属性的默认值
本帖最后由 不喝茶的陆羽 于 2013-6-17 17:07 编辑

不在这个javabean中完成。
比如:存在一个JavaBean,它包含以下几种可能的属性: 1:boolean/Boolean 2:int/Integer
          3:String 4:double/Double 属性名未知,现在要给这些属性设置默认值,以下是要求的默认值:
          String类型的默认值为字符串
www.itheima.com int/Integer类型的默认值为100
          boolean/Boolean类型的默认值为true double/Double的默认值为0.01D.
          只需要设置带有getXxx/isXxx/setXxx方法的属性,非JavaBean属性不设置,请用代码实现

作者: 曹宇    时间: 2013-6-8 16:54
还在学习高新中,没看到javabean  还不懂。
帮顶了!!!
作者: 不喝茶的陆羽    时间: 2013-6-8 17:22
谢谢斑竹了~
真心急求大手回复啊~自己顶顶~
作者: 不喝茶的陆羽    时间: 2013-6-8 17:38
顶顶,求助~
作者: 蚂蚁搬家    时间: 2013-6-8 20:42
张孝祥老师将讲avaBean的时候,讲了PropertyDescriptor(属性描述符)和Introspector(内省)两种方式,但都需要属性名,这个没有属性名,还真不知道咋弄
作者: yasyas001    时间: 2013-6-8 22:55
  1. package com.itheima;
  2. import java.beans.BeanInfo;
  3. import java.beans.IntrospectionException;
  4. import java.beans.Introspector;
  5. import java.beans.PropertyDescriptor;
  6. import java.lang.reflect.InvocationTargetException;
  7. import java.lang.reflect.Method;

  8. /**
  9. * 存在一个JavaBean,它包含以下几种可能的属性: 1:boolean/Boolean 2:int/Integer 3:String
  10. * 4:double/Double 属性名未知,现在要给这些属性设置默认值,以下是要求的默认值: String类型的默认值为字符串
  11. * www.itheima.com int/Integer类型的默认值为100 boolean/Boolean类型的默认值为true
  12. * double/Double的默认值为0.01D.
  13. * 只需要设置带有getXxx/isXxx/setXxx方法的属性,非JavaBean属性不设置,请用代码实现
  14. *  @author Liu wangfang
  15. */
  16. public class Test_5 {
  17.         public static void main(String[] args) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
  18.                 //1.创建一个javaBean对象;
  19.                 JavaBean jb = new JavaBean();
  20.                 //2.使用內省中方法获得BeanInfo对象;
  21.                 BeanInfo bi = Introspector.getBeanInfo(jb.getClass());
  22.                 //3.获得BeanInfo中的属性描述器数组;
  23.                 PropertyDescriptor[] pds = bi.getPropertyDescriptors();
  24.                 //4.遍历数组,判断属性的类型是否是要求的类型,如果是,就设置默认值;
  25.                 for(PropertyDescriptor pd : pds){
  26.                         //5.遍历每个属性描述器时,先获得其set方法;
  27.                         Method method = pd.getWriteMethod();
  28.                         //6.判断属性的类型是否是题目要求的类型
  29.                          if(pd.getPropertyType()==boolean.class ||pd.getPropertyType()==Boolean.class){
  30.                                  //7.set方法的调用,赋值
  31.                                  method.invoke(jb,true);
  32.                          } if(pd.getPropertyType()==int.class ||pd.getPropertyType()==Integer.class){
  33.                                  method.invoke(jb,100);
  34.                          } if(pd.getPropertyType()==double.class ||pd.getPropertyType()==Double.class){
  35.                                  method.invoke(jb,0.01D);
  36.                          } if(pd.getPropertyType()==String.class ){
  37.                                  method.invoke(jb,"www.itheima.com");
  38.                          }
  39.                 }
  40. //                System.out.println(jb);
  41.         }

  42. }
  43. class JavaBean{
  44.         private boolean flag;
  45.         private int num;
  46.         private String name;
  47.         private double db;
  48.         private char c;
  49.         public boolean isFlag() {
  50.                 return flag;
  51.         }
  52.         public void setFlag(boolean flag) {
  53.                 this.flag = flag;
  54.         }
  55.         public int getNum() {
  56.                 return num;
  57.         }
  58.         public void setNum(int num) {
  59.                 this.num = num;
  60.         }
  61.         public String getName() {
  62.                 return name;
  63.         }
  64.         public void setName(String name) {
  65.                 this.name = name;
  66.         }
  67.         public double getDb() {
  68.                 return db;
  69.         }
  70.         public void setDb(double db) {
  71.                 this.db = db;
  72.         }
  73. //        public String toString(){
  74. //                return name +"**"+ db + "**"+num +"**"+ flag;
  75. //        }
  76. }
复制代码
这是之前考试做的一道题,你可以参考一下
作者: 不喝茶的陆羽    时间: 2013-6-9 12:18
yasyas001 发表于 2013-6-8 22:55
这是之前考试做的一道题,你可以参考一下

我也是这么写的,但是你这个实际测试时能改变int型和double型的默认值吗?
作者: 袁梦希    时间: 2013-6-9 15:14
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。{:soso_e102:}
作者: shiweiCao    时间: 2013-6-9 15:34
路过, 这个还不会,学习下
作者: 不喝茶的陆羽    时间: 2013-6-9 20:32
袁梦希 发表于 2013-6-9 15:14
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。 ...

未解决...
作者: 石贤芝    时间: 2013-6-10 09:48
不喝茶的陆羽 发表于 2013-6-9 12:18
我也是这么写的,但是你这个实际测试时能改变int型和double型的默认值吗? ...

应该可以吧。。。

               if(pd.getPropertyType()==int.class ||pd.getPropertyType()==Integer.class){

                                 method.invoke(jb,100);

                         } if(pd.getPropertyType()==double.class ||pd.getPropertyType()==Double.class){

                                 method.invoke(jb,0.01D);

                         }

这几句代码不就是这个意思么? 还是我没有理解你说的意思?
作者: 陈昊    时间: 2013-6-10 10:49
本帖最后由 陈昊 于 2013-6-10 11:09 编辑

import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;   
public final class XBean {   
    private final PropertyChangeSupport pcs       = new PropertyChangeSupport(this);     
private String                      site      = "bbs.itheima.com";     
private boolean                     validated = true;     
private int                         amount    = 100;     
private double                      price     = 0.01;           
public XBean() {   
  }           
public final String getSite() {         
return site;   
  }         
public final void setSite(final String site) {   
      pcs.firePropertyChange("site", getSite(), site);        
       this.site = site;   
}         
public final boolean isValidated() {      
  return validated;   
}         
public final void setValidated(final boolean validated) {      
      pcs.firePropertyChange("validate", isValidated(), validated);        
      this.validated = validated;
  }         
public final int getAmount() {  
       return amount;   
}           
public final void setAmount(final int amount) {        
     pcs.firePropertyChange("amount", getAmount(), amount);         
     this.amount = amount;   
}         
public final double getPrice() {         
      return price;   
}         
public final void setPrice(final double price) {        
      pcs.firePropertyChange("price", getPrice(), price);        
      this.price = price;   
}         
public void addPropertyChangeListener(final PropertyChangeListener 1) {        
      pcs.addPropertyChangeListener(1);   
}         
public void removePropertyChangeListener(final PropertyChangeListener 1) {        
     pcs.removePropertyChangeListener(1);   
}           
public static void main(final String[] args) {         
   final XBean bean = new XBean();        
   bean.addPropertyChangeListener(new PropertyChangeListener() {                           
             @Override            
             public void propertyChange(final PropertyChangeEvent evt) {
                   System.out.println(evt);            
                  }        
      });         bean.setAmount(200);         bean.setValidated(false);         bean.setSite("bbs.csdn.net");         bean.setPrice(10.11);     } }

作者: 不喝茶的陆羽    时间: 2013-6-10 13:39
石贤芝 发表于 2013-6-10 09:48
应该可以吧。。。

               if(pd.getPropertyType()==int.class ||pd.getPropertyType()==Intege ...

你运行了吗?我和你写的一样,不行...另一个朋友也是这么写的,int型也改不了
作者: 石贤芝    时间: 2013-6-10 15:05
不喝茶的陆羽 发表于 2013-6-10 13:39
你运行了吗?我和你写的一样,不行...另一个朋友也是这么写的,int型也改不了 ...

额,确实没运行。那就把我写的贴出来吧,是个入学测试题。我的可以设置默认值。
  1. public class Test8 {

  2.         public static void main(String[] args) throws Exception {
  3.                 //给一个实例化对象
  4.                 Worker worker = new Worker();
  5.                 //因worker的属性名未知,故要用内省
  6.                 BeanInfo beanInfo = Introspector.getBeanInfo(worker.getClass());
  7.                 //拿到所有的属性
  8.                 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
  9.                 //遍历属性
  10.                 for(PropertyDescriptor pd : pds){
  11.                         //给String类型的属性设置默认值
  12.                         if(pd.getPropertyType() == (String.class)){
  13.                                 Method methodSetStr =  pd.getWriteMethod();
  14.                                 methodSetStr.invoke(worker, "www.itheima.com");
  15.                                 Method methodGetStr = pd.getReadMethod();
  16.                                 //打印出属性名和属性值
  17.                                 System.out.println(pd.getName()+": "+methodGetStr.invoke(worker));
  18.                         }
  19.                         //给int/Integer类型的属性设置默认值
  20.                         else if(pd.getPropertyType()==(int.class) || pd.getPropertyType()==(Integer.class)){
  21.                                 Method methodSetInt =  pd.getWriteMethod();
  22.                                 methodSetInt.invoke(worker, 100);
  23.                                 Method methodGetInt = pd.getReadMethod();
  24.                                 //打印出属性名和属性值
  25.                                 System.out.println(pd.getName()+": "+methodGetInt.invoke(worker));
  26.                         }
  27.                         //给boolean/Boolean类型的属性设置默认值
  28.                         else if(pd.getPropertyType()==(boolean.class) || pd.getPropertyType()==(Boolean.class)){
  29.                                 Method methodSetBool =  pd.getWriteMethod();
  30.                                 methodSetBool.invoke(worker, true);
  31.                                 Method methodGetBool = pd.getReadMethod();
  32.                                 //打印出属性名和属性值
  33.                                 System.out.println(pd.getName()+": "+methodGetBool.invoke(worker));
  34.                         }
  35.                         //给double/Double类型的属性设置默认值
  36.                         else if(pd.getPropertyType()==(double.class) || pd.getPropertyType()==(Double.class)){
  37.                                 Method methodSetDou =  pd.getWriteMethod();
  38.                                 methodSetDou.invoke(worker, 0.01D);
  39.                                 Method methodGetDou = pd.getReadMethod();
  40.                                 //打印出属性名和属性值
  41.                                 System.out.println(pd.getName()+": "+methodGetDou.invoke(worker));
  42.                         }
  43.                 }
  44.         }
  45. }


  46. //JavaBean类
  47. class Worker {
  48.         private String workCompanyName; //员工所属公司
  49.         private boolean married; //结婚与否
  50.         private int id; //员工号
  51.         private double income; //月薪
  52.         public String getWorkCompanyName() {
  53.                 return workCompanyName;
  54.         }
  55.         public void setWorkCompanyName(String workCompanyName) {
  56.                 this.workCompanyName = workCompanyName;
  57.         }
  58.         public int getId() {
  59.                 return id;
  60.         }
  61.         public void setId(int id) {
  62.                 this.id = id;
  63.         }
  64.         public double getIncome() {
  65.                 return income;
  66.         }
  67.         public void setIncome(double income) {
  68.                 this.income = income;
  69.         }
  70.        
  71.         public boolean isMarried(){
  72.                 return this.married;
  73.         }
  74.         public void setMarried(boolean married){
  75.                 this.married = married;
  76.         }
  77. }
复制代码

作者: 袁梦希    时间: 2013-6-12 19:08
你这问题无人能档
作者: 不喝茶的陆羽    时间: 2013-6-17 17:06
石贤芝 发表于 2013-6-10 15:05
额,确实没运行。那就把我写的贴出来吧,是个入学测试题。我的可以设置默认值。 ...

明白了,教训啊,我怎么看都是和你的一样,怎么我的int就改不了呢?后来才知道,不知道怎的我的int的getset方法的public没了,太神奇了,软件生成的我就一直没检查那...以后真的仔细了....




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2