黑马程序员技术交流社区
标题:
关于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进行操作
使用内省我们可以简化书写,实现通用性,这里写一个通用的方法,让属性名称为一个变量,假如属性名很多的话,得到属性名后,就可以遍历,然后给他们一一的赋值,这就是内省的魅力。
如果不用反射,那么传统的方式是不可能实现通用的。
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import cn.itcast.day08.domain.User;
public class Demo2 {
/**
* @param args
* @throws IntrospectionException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws Exception {
// 内省
User user = new User();
setProperty(user, "name", "wangwu");
setProperty(user, "age", 11);
System.out.println(user);
}
// 实现一个通用的方法 为任意的一个javabean的任意属性赋任意值
public static void setProperty(Object bean, String fieldName, Object value) throws Exception {
// 创建属性描述器
PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, bean.getClass());
// 获得 写方法
Method writeMethod = descriptor.getWriteMethod();
// 调用 写方法
writeMethod.invoke(bean, value);
}
}
复制代码
作者:
lkjghvcx@163.co
时间:
2013-7-19 15:40
反射,内省和代理,一般是框架用的比较多,知道这些知识是为了便以以后的学习,可以比较容易的理解框架的原理;
就内省来说,可以以struts2的action为例:action 里面定义了许多getter setter方法,
比如:
jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title><s:text name="管理员登陆"/></title>
</head>
<body>
<s:form action="adminlogin">
<s:textfield name="admin" label="管理员"/>
<s:textfield name="password" label="密码"/>
<s:submit label="登陆"/>
</s:form>
</body>
</html>
复制代码
相应action:
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;
import service.AdminLogin;
public class AdminLoginAction extends ActionSupport{
private String admin;
private String password;
public String getAdmin() {
return admin;
}
public void setAdmin(String admin) {
this.admin = admin;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String execute() throws Exception
{
AdminLogin a=new AdminLogin();
if (a.getAdmin(getPassword())!=null)
{
//将登录的用户名放入session范围内
ActionContext.getContext().getSession().put("user" , getAdmin());
return SUCCESS;
} else
{
return ERROR;
}
}
}
复制代码
这样Action可以自动获取jsp页面中用户输入的 admin password 信息 并对其进行处理
反射,内省和代理,是框架用的比较多
,
作者:
王靖远
时间:
2013-7-19 15:43
把一个类看成javabean就可以用javabean的操作方法来操作它了。其实如果没有那些辅助的工具类就没有必要去看一个类是否是javabean了。
作者:
黎志文
时间:
2013-7-19 18:03
又看了好几遍视频,终于勉强理解了,谢谢各位的热心解答!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2