一.什么是JavaBean
JavaBean是一种规范,也就是对类的要求。它要求Java类的成员变量提供公有getxxx/setxxx方法,这样的成员变量被称之为JavaBean属性。成员变量也必须是私有的。
JavaBean还要求类必须提供仅有的并且是公有的无参构造器,例如:public User() {…},没有提供一个构造器,默认提供公共无参构造器。(为什么在JavaBean中要提供无参构造器,因为在JavaWeb中,<userBean>
在创建对象时会根据类名创建对象,就要用到反射来创建Class.forName("类的全路径").newInstance()
,这里使用的构造方法就是无参构造方法。还有就是Struts里面,Action也要写无参构造,因为web容器也会根据struts.xml中配置的Action类名来创建对象。)
User.java
package cn.itcast.domain;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
去掉get或者set后的方法名再首字母小写就是这个类的属性了。
如getPassword() 方法的属性就是password。但是这只是针对这种格式的getPassword()方法。
二.JavaBean属性
JavaBean属性被分为四种:
- 单值属性:比如String name等
- 索引属性:操作数组,其中可能定义两套get,set,一个是针对数组,一个是针对数组元素。
- 关联属性:如果当前属性值改变时,它就通知所以相关联的属性,说我的值改变了,但是其它相关属性没有权利阻止改变。
- 限制属性:如果当前属性值改变时,它就通知所以相关联的属性,说我的值改变了,如果其中有一个相关属性阻止当前属性值改变时,当前属性值就不能够改变。
这里只介绍最简单的并且常用的单值属性。
JavaBean属性是具有getxxx/setxxx方法的成员变量。
- 也可以只提供getxxx方法,这样的属性叫只读属性;
- 也可以只提供setxxx方法,这样的属性叫只写属性;
- 如果属性类型为boolean类型,那么读方法的格式可以是get或is。例如名为abc的boolean类型的属性,它的读方法可以是getAbc(),也可以是isAbc();
JavaBean属性名要求:前两个字母要么都大写,要么都小写(这是JavaBean规定死的,如果这样写,在使用struts出现找不到属性异常时,但是还是有解决办法的。JavaBean命名规范验证):
不用管其它格式命名,一般遵循规范写就不会出错,遵循:属性前两个字母要么都大写,要么都小写。(属性是由get/set决定的!)
还有就是不然自己写出来的代码看起来也很丑。
package com.domain;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
class Test{
private String AA;
private String Bb;//错误的JavaBean属性
private String cC;//错误的JavaBean属性
private String dd;
public String getAA() {
return AA;
}
public void setAA(String aA) {
AA = aA;
}
public String getBb() {//错误的JavaBean属性
return Bb;
}
public void setBb(String bb) {
Bb = bb;
}
public String getcC() {//错误的JavaBean属性
return cC;
}
public void setcC(String cC) {
this.cC = cC;
}
public String getDd() {
return dd;
}
public void setDd(String dd) {
this.dd = dd;
}
}
public class JavaBean_02 {
public static void main(String[] args)throws Exception {
BeanInfo beanInfo = Introspector.getBeanInfo(Test.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for(int i=0;i<pds.length;i++){
System.out.println(pds[i].getName());
}
}
}
/*打印出来为:
AA
bb
cC
dd
*/
JavaBean可能存在属性,但不存在这个成员变量,这也是可以的。例如:
public class User {
public String getUsername() {
return "zhangSan";
}
}
上例中User类有一个名为username的只读属性!但User类并没有username这个成员变量!
还可以更变态一点:
public class User {
private String hello;
public String getUsername() {
return hello;
}
public void setUsername(String username) {
this.hello = username;
}
}
上例中User类中有一个名为username的属性,它是可读可写的属性!而User类的成员变量名为hello!也就是说JavaBean的属性名取决与方法名称,而不是成员变量的名称。但通常没有人做这么变态的事情。
总结JavaBean的规范:
1. 必须要有一个公有无参构造器
2. 提供公有get/set方法,如果只有get方法,那么这个属性是只读属性!
3. 属性:有get/set方法的成员,还可以没有成员,只有get/set方法。属性名称由get/set方法来决定!而不是成员名称,如果有成员变量时,成员变量是私有的!
4. 方法名称满足一定的规范,那么它就是属性!boolean类型的属性,它的读方法可以是is开头,也可以是get开头!
5. 类的修饰符也是公共的。