黑马程序员技术交流社区

标题: 学习JavaBean的疑惑 [打印本页]

作者: 谢冬    时间: 2013-3-23 16:50
标题: 学习JavaBean的疑惑
本帖最后由 谢冬 于 2013-3-24 09:03 编辑

javabean就是一个简单的封装类,访问器属性,为什么不直接通过反射的getDeclaredField方法来获取Field呢?通过setAccessble(boolean flag)方法和set(),get()方法来直接操作属性值,比通过PropertyDescriptor对象的可读可写方法操作不是更简单吗。我对它的作用很不解
作者: 谷文仁    时间: 2013-3-23 17:03
1.  使得HTML与java程序分离,这样便于维护代码。
2.  可以降低开发动态网页人员对java编程能力的要求。
3.  DQM脚本语言侧重于生成动态网页,事务处理由JavaBean来完成,这样可以充分利用JavaBean组件的可重用性特点,提高开发网站的效率。
希望以上对你有帮助!
作者: 刘凯    时间: 2013-3-23 17:26
本帖最后由 刘凯 于 2013-3-23 17:34 编辑

我认为

1, 你并不能知道一个类中的变量名 如果这个变量名是私有的话   你根本就不能够得到这个变量名叫什么 那么 你怎么getDeclaredField()  里边参数是什么 ??
     
     而javaBean里边的特有方法 setX getX 是共有的 所以你从这个暴露出来的方法来推断变量名是x  但真正的变量名是不是x呢??

   例如  
class Test{
         private int y =1 ;
          public int  getX(){
           return y;
           }
           public int  setX(){
           return y;
           }
}
你只能从方法名里推断里边有个x的属性  ,然而并不是。实际上的属性名为y

所以用你说的那个方法 不能够实现了
而如果用
           Test  pt1 = new Test();
            PropertyDescriptor pd2 = new PropertyDescriptor("x", pt1.getClass());
                Method metthodSetX = pd2.getWriteMethod();
                  metthodSetX.invoke(pt1,2);
               则还是可以对属性y进行操作的    因为这个传入的“x”是用来找getX方法对应的那个属性,而并非属性就叫做x

2,除此之外  BeanUtil工具类的运用更是简化了代码的书写,使得操作javaBean更为方便


作者: 谢冬    时间: 2013-3-23 17:53
刘凯 发表于 2013-3-23 17:26
我认为

1, 你并不能知道一个类中的变量名 如果这个变量名是私有的话   你根本就不能够得到这个变量名叫 ...

怎么会不知道,可以通过Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,然后遍历数组就知道啦,这里既然直接通过对象.getClass()方法来获取对象,要获取字段名,岂不是更简单?
作者: 刘凯    时间: 2013-3-23 18:04
谢冬 发表于 2013-3-23 17:53
怎么会不知道,可以通过Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class  ...

那就是说 我每次存储和获得这个对象中某个属性的值 先得对象.getClass().getDeclaredFields()  然后遍历这个返回的数组  然后分别获得Field.getName()  再然后从里边选择设置的对象 和获取的对象值??!!   
那你比较一下是直接通过方法名暴露出来的“属性名”来操作简单 还是这么简单??  
再有 ,如果用了BeanUtil 这个jar包后 里边的工具类 更是一句话就可以实现对对象属性操作  而这个工具类内部都是
         Test  pt1 = new Test();
            PropertyDescriptor pd2 = new PropertyDescriptor("x", pt1.getClass());
                Method metthodSetX = pd2.getWriteMethod();
                  metthodSetX.invoke(pt1,2);  
这些方法的封装 , 使得我们不必再去写上边这些代码  进而编程效率提高   这都是基于javaBean的   难道我们放着简单的不用 ,非得自个去写自己的代码么。。。
作者: 谢冬    时间: 2013-3-23 18:06
谷文仁 发表于 2013-3-23 17:03
1.  使得HTML与java程序分离,这样便于维护代码。
2.  可以降低开发动态网页人员对java编程能力的要求。
3. ...

可能现在程序中体现的好处太少 所以没感受到它的强大 请问什么是DQM脚本语言?
作者: 谢冬    时间: 2013-3-23 18:18
刘凯 发表于 2013-3-23 18:04
那就是说 我每次存储和获得这个对象中某个属性的值 先得对象.getClass().getDeclaredFields()  然后遍历 ...

既然有它的存在,肯定有它的用处,只是我们现在接触的太少,没到真正排上用场的时候,都没真正的用过,所以先不讨论它的作用,它的好处。至于你质问我的问题,我反过来问你,在我们都不知道一个类的结构的情况下,你又怎么能知道它的属性名是什么?你拿什么去创建对象?还怎么调用读写方法?
作者: 刘凯    时间: 2013-3-23 19:05
本帖最后由 刘凯 于 2013-3-23 19:07 编辑
谢冬 发表于 2013-3-23 18:18
既然有它的存在,肯定有它的用处,只是我们现在接触的太少,没到真正排上用场的时候,都没真正的用过,所 ...

正因为不知道属性名称才通过暴露出来的方法来获得javaBean想告诉我们它里边有什么属性啊 ,它暴露出getX方法,那么他就是想告诉你它里边有这个X属性 ,就跟视频上那个Date的例子一样,张老师不就是通过getTime这个方法推断出里边有time这个属性的么,但这个属性真正的名字是不是time 我们都不知道,我们只是知道他想告诉我们他里边有这个time属性,如果这个属性的名字真是time ,那么你那个方法当然可行,如果不是呢??

怎么什么来创建对象,拿它暴露出来的构造方法来创建对象,API里给的构造方法不都是暴露出来的么,不都是public的么?? 如果是个借口,或者把构造方法私有,API的构造方法里是没有的,也就是说不能创建对象,或者说是得调用其中的静态方法返回对象。

有了对象,也告诉你是个javabean 也暴露出来了get 和set 方法  不就能够利用操作javaBean的类和工具来对这个javaBean 以操作javaBean的方式获得其中的读写方法,进而读写数据么???
作者: 谢冬    时间: 2013-3-23 19:56
你说得很有道理,现在抛开一切学过的理论,我们来简单模拟一个场景。如果我写一个动物类,但你不知道我封装的属性叫什么,也不知道我对外提供的方法名是什么,在不使用Field类的前提下,当然也不能直接创建动物类对象(如果直接创建对象,为什么不直接使用getset访问器来访问,何必使用反射这么麻烦的操作),也就是说第一步你只能通过Class.forName()方法来做,你怎么通过PropertyDescriptor类来实现?




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