A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 官珺伟 高级黑马   /  2014-4-20 11:56  /  1723 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 官珺伟 于 2014-4-20 21:58 编辑

存在一个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属性不设置,请用代码实现

2 个回复

倒序浏览
这个问题之前我做过,分享我的代码和设计思路给你吧

  1. package com.itheima;

  2. import java.beans.BeanInfo;
  3. import java.beans.Introspector;
  4. import java.beans.PropertyDescriptor;
  5. import java.lang.reflect.Method;

  6. /*       
  7. * 5、 存在一个JavaBean,它包含以下几种可能的属性:
  8. 1:boolean/Boolean
  9. 2:int/Integer
  10. 3:String
  11. 4:double/Double
  12. 属性名未知,现在要给这些属性设置默认值,以下是要求的默认值:
  13. String类型的默认值为字符串 www.itheima.com
  14. int/Integer类型的默认值为100
  15. boolean/Boolean类型的默认值为true
  16. double/Double的默认值为0.01D.
  17. 只需要设置带有getXxx/isXxx/setXxx方法的属性,非JavaBean属性不设置,请用代码实现

  18. */

  19. /*
  20. * 设计思路:
  21.         设计一个模拟题目要求的JavaBean类,通过反射进行对其中的未知属性名的变量赋值。
  22.         1,拿到字节码文件,建立一个空构造函数的实例对象。
  23.         2,利用字节码作为参数,Introspector.getBeanInfo(JavaBean.class)得到BeanInfo实例对象。
  24.         3,通过BeanInfo的方法,beanInfo.getPropertyDescriptors()拿到该字节码的所有属性描述。
  25.         3,通过PropertyDescriptor--属性描述实例对象,通过调用getWriteMethod()方法,修改字节码中属性的值。
  26.         4,在通过属性描述中getPropertyType()方法,定位是那种类型的成员变量,筛选出后,进行相应的修改赋值。
  27.         */
  28.        
  29.         //建立模拟JavaBean类
  30. class JavaBean{
  31.         //成员变量
  32.         private boolean flag;
  33.         private int number;
  34.         private String itcast;
  35.         private double money;
  36.        
  37.         //成员变量相应的set和get方法
  38.         public void setItcast(String newitcast){
  39.                 itcast=newitcast;
  40.         }
  41.         public String getItcast(){
  42.                 return itcast;
  43.         }
  44.        
  45.         public void setNumber(int newnumber){
  46.                 number=newnumber;
  47.         }
  48.         public int getNumber(){
  49.                 return number;
  50.         }
  51.        
  52.         public void setFlag(boolean newflag){
  53.                 flag=newflag;
  54.         }
  55.         public boolean getFlag(){
  56.                 return flag;
  57.         }
  58.        
  59.         public void setMoney(double newmoney){
  60.                 money=newmoney;
  61.         }
  62.         public double getMoney(){
  63.                 return money;
  64.         }
  65. }
  66. public class Test5 {


  67.         public static void main(String[] args) throws Exception {
  68.                                 //拿到字节码
  69.                         Class<JavaBean> clazz=JavaBean.class;
  70.                                 //拿到字节码的一个对象实例
  71.                         Object obj=clazz.newInstance();
  72.                                 //通过字节码拿到BeanInfo实例对象
  73.                         BeanInfo beanInfo=Introspector.getBeanInfo(clazz);
  74.                                 //通过BeanInfo拿到这个字节码的所有属性描述
  75.                         PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors();
  76.                                 //通过属性描述对象拿到属性对应的set方法和get方法,通过set方法进行属性赋值
  77.                         for(PropertyDescriptor pd:pds){
  78.                                 //拿到当前属性的set方法
  79.                                 Method setMethod=pd.getWriteMethod();
  80.                                 Method getMethod=pd.getReadMethod();
  81.                                
  82.                                 //拿到当前属性的类型字节码
  83.                                 Class<?> properclass=pd.getPropertyType();
  84.                                 //通过字节码来筛选出相应的属性,再对应赋值,赋值完毕后,通过打印get方法查看赋值情况。
  85.                                 if(properclass==String.class){
  86.                                         setMethod.invoke(obj, "www.itheima.com");
  87.                                         System.out.println(getMethod.invoke(obj));
  88.                                        
  89.                                 }else if(properclass==int.class || properclass==Integer.class){
  90.                                         setMethod.invoke(obj, 100);
  91.                                         System.out.println(getMethod.invoke(obj));
  92.                                        
  93.                                 }else if(properclass==Boolean.class || properclass==boolean.class){
  94.                                         setMethod.invoke(obj, true);
  95.                                         System.out.println(getMethod.invoke(obj));
  96.                                
  97.                                 }else if(properclass==Double.class || properclass==double.class){
  98.                                         setMethod.invoke(obj, 0.01D);
  99.                                         System.out.println(getMethod.invoke(obj));
  100.                                 }
  101.                                
  102.                         }               
  103.                                        
  104.                         }
  105.                        
  106.         }

复制代码

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
  1. public class JavaBeanDemo
  2. {
  3.         private boolean bool;
  4.         private String str;
  5.         private int Inter;
  6.         private double dou;
  7.         //string的初始值是null,int初始值是0,double初始值是0.0,boolean初始值是false
  8.         //getXXX方法是用于获取值的,所以在get方法里加一个判断就好了,如果是刚初始化的话,就返回你设置的默认值
  9.         public String getStr() {
  10.                 if(str==null)
  11.                 {
  12.                         return "www.itheima.com";
  13.                 }
  14.                 else
  15.                 {
  16.                 return str;
  17.                 }
  18.         }
  19.         public void setStr(String str) {
  20.                 this.str = str;
  21.         }
  22.         public int getInter() {
  23.                 if(Inter==0)
  24.                 {
  25.                         return 100;
  26.                 }
  27.                 else {
  28.                         return Inter;
  29.                 }
  30.                
  31.         }
  32.         public void setInter(int inter) {
  33.                 Inter = inter;
  34.         }
  35.         public double getDou() {
  36.                 if(dou==0.0)
  37.                 {
  38.                         return 0.01;
  39.                 }
  40.                 else {
  41.                         return dou;
  42.                 }
  43.                
  44.         }
  45.         public void setDou(double dou) {
  46.                 this.dou = dou;
  47.         }
  48.         public boolean isBool() {
  49.                 if(!bool)
  50.                 {
  51.                         return true;
  52.                 }
  53.                 else {
  54.                         return bool;
  55.                 }
  56.                
  57.         }
  58.         public void setBool(boolean bool) {
  59.                 this.bool = bool;
  60.         }
  61. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马