黑马程序员技术交流社区

标题: 关于JavaBean和内省的问题 [打印本页]

作者: 黎志文    时间: 2013-7-19 11:42
标题: 关于JavaBean和内省的问题
本帖最后由 黎志文 于 2013-7-19 18:00 编辑

视频讲的太笼统了,看了五六遍都看不明白,查了些资料,明白了一点点关于JavaBean和内省的含义:JavaBean不是一个实际的类,只是一种称呼,如果一个java类中含有setX()、getX()的方法,那么这个类就叫做JavaBean,而内省是用于操作javaBean的一种工具类,不知是否这样理解?

但是我觉得奇怪,那个java类中都有setX()和getX()方法了,这个两个方法都是公有的,那我在其他类中直接通过这个类的对象来调用这两个方法,不就可以直接获取到X属性的值了么?还用得着内省来操作?
用内省操作有什么作用,有什么好处?

作者: wedge    时间: 2013-7-19 12:03
JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。   JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。
作者: 木、易m    时间: 2013-7-19 12:04
举个例子吧,在我们网页注册的时候,一般web都是通过javabean来封装数据,然后封装完数据我们可能需要写到文件上,这时候如果没有用内省,那么要一个一个操作,要是用内省,直接一次性把所有数据封装就好了
作者: tonygone    时间: 2013-7-19 13:25
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
内省主要用于对JavaBean进行操作
使用内省我们可以简化书写,实现通用性,这里写一个通用的方法,让属性名称为一个变量,假如属性名很多的话,得到属性名后,就可以遍历,然后给他们一一的赋值,这就是内省的魅力。

如果不用反射,那么传统的方式是不可能实现通用的。
  1. import java.beans.IntrospectionException;
  2. import java.beans.PropertyDescriptor;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;

  5. import cn.itcast.day08.domain.User;

  6. public class Demo2 {

  7.     /**
  8.      * @param args
  9.      * @throws IntrospectionException
  10.      * @throws InvocationTargetException
  11.      * @throws IllegalAccessException
  12.      * @throws IllegalArgumentException
  13.      */
  14.     public static void main(String[] args) throws Exception {
  15.         // 内省
  16.         
  17.         User user = new User();
  18.         
  19.         setProperty(user, "name", "wangwu");
  20.         setProperty(user, "age", 11);
  21.         
  22.         System.out.println(user);

  23.     }
  24.    
  25.     // 实现一个通用的方法   为任意的一个javabean的任意属性赋任意值
  26.     public static void setProperty(Object bean, String fieldName, Object value) throws Exception {
  27.         // 创建属性描述器
  28.         PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, bean.getClass());
  29.         
  30.         // 获得 写方法
  31.         Method writeMethod = descriptor.getWriteMethod();
  32.         
  33.         // 调用 写方法
  34.         writeMethod.invoke(bean, value);
  35.     }

  36. }
复制代码

作者: lkjghvcx@163.co    时间: 2013-7-19 15:40
反射,内省和代理,一般是框架用的比较多,知道这些知识是为了便以以后的学习,可以比较容易的理解框架的原理;
就内省来说,可以以struts2的action为例:action 里面定义了许多getter setter方法,
比如:
jsp页面:
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"%>
  2. <%@taglib prefix="s" uri="/struts-tags"%>
  3. <html>
  4. <head>
  5. <title><s:text name="管理员登陆"/></title>
  6. </head>
  7. <body>
  8. <s:form action="adminlogin">
  9.             <s:textfield name="admin" label="管理员"/>
  10.             <s:textfield name="password" label="密码"/>
  11.             <s:submit label="登陆"/>
  12. </s:form>
  13. </body>
  14. </html>
复制代码
相应action:


  1. import com.opensymphony.xwork2.ActionSupport;
  2. import com.opensymphony.xwork2.ActionContext;

  3. import  service.AdminLogin;

  4. public class AdminLoginAction extends ActionSupport{

  5.         private String admin;
  6.         private String password;
  7.         
  8.         
  9.         
  10.         public String getAdmin() {
  11.                 return admin;
  12.         }
  13.         public void setAdmin(String admin) {
  14.                 this.admin = admin;
  15.         }
  16.         public String getPassword()
  17.         {
  18.                 return password;
  19.         }
  20.         public void setPassword(String password)
  21.         {
  22.                 this.password = password;
  23.         }
  24.         
  25.         public String execute() throws Exception
  26.         {
  27.                 AdminLogin a=new AdminLogin();
  28.                 if (a.getAdmin(getPassword())!=null)
  29.                         
  30.                 {
  31.                         //将登录的用户名放入session范围内
  32.                         ActionContext.getContext().getSession().put("user" , getAdmin());
  33.                         return SUCCESS;
  34.                 }                else
  35.                 {
  36.                         return ERROR;
  37.                 }
  38.         }
  39. }
复制代码
这样Action可以自动获取jsp页面中用户输入的 admin password 信息 并对其进行处理
反射,内省和代理,是框架用的比较多
作者: 王靖远    时间: 2013-7-19 15:43
把一个类看成javabean就可以用javabean的操作方法来操作它了。其实如果没有那些辅助的工具类就没有必要去看一个类是否是javabean了。
作者: 黎志文    时间: 2013-7-19 18:03
又看了好几遍视频,终于勉强理解了,谢谢各位的热心解答!




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