目录JavaBean:标准化的数据封装模式JavaBean的定义基本规范字段与属性的区别getter和setter的命名规则JavaBean的工具支持IDE自动生成getter和setter利用反射操作JavaBean总结
JavaBean:标准化的数据封装模式
JavaBean的定义
JavaBean本质上是一个普通的Java类,但它遵循一套严格的命名和设计规范,使得其能够被工具和框架自动识别和处理。
基本规范
一个标准的JavaBean需满足以下条件:
私有字段:所有实例变量(字段)必须使用private修饰,确保数据封装
公共方法:通过公共的getter和setter方法访问和修改字段
命名规则:getter和setter方法需遵循特定命名规范
默认构造方法:提供无参构造方法,便于框架反射创建实例
字段与属性的区别
在JavaBean中,字段(Field) 和属性(Property) 是两个不同的概念:
字段:类中声明的私有变量(如private String name)
属性:通过getter和setter方法定义的逻辑属性,可能对应字段,也可能不对应
public class Person {
private String name; // 字段
private int birthYear; // 字段
// name属性的getter和setter(对应name字段)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
// age属性的getter(不对应字段,通过计算得到)
public int getAge() {
return LocalDate.now().getYear() - birthYear;
}
// birthYear字段的setter(仅写,无对应getter)
public void setBirthYear(int birthYear) {
this.birthYear = birthYear;
}
}
在这个例子中:
name是读写属性(有getter和setter)
age是只读属性(只有getter)
birthYear是只写属性(只有setter)
getter和setter的命名规则
JavaBean的核心规范体现在getter和setter的命名上:
普通类型字段:
getter:get + 首字母大写的字段名(如getName())
setter:set + 首字母大写的字段名(如setName(String name))
boolean类型字段:
getter:可以是is + 首字母大写的字段名(如isMarried()),也可以是get开头
setter:仍使用set + 首字母大写的字段名(如setMarried(boolean married))
public class User {
private String username;
private boolean active;
// username属性
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
// active属性(boolean类型)
public boolean isActive() { return active; } // 推荐使用is开头
// public boolean getActive() { return active; } // 也允许使用get开头
public void setActive(boolean active) { this.active = active; }
}
JavaBean的工具支持
现代IDE和工具对JavaBean提供了强大的支持,掌握这些工具的使用能显著提高开发效率。
IDE自动生成getter和setter
主流IDE(如IntelliJ IDEA、Eclipse)都支持自动生成getter和setter方法:
在IntelliJ IDEA中的操作步骤:
定义私有字段后,按下Alt + Insert(Windows)或Cmd + N(Mac)
选择Getter and Setter
选择需要生成方法的字段,点击OK
生成示例:
public class Product {
private Long id;
private String name;
private double price;
// 自动生成的getter和setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public double getPrice() { return price; }
public void setPrice(double price) { this.price = price; }
}
利用反射操作JavaBean
Java提供了java.beans包,用于通过反射机制操作JavaBean的属性:
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class BeanInspector {
public static void main(String[] args) throws Exception {
// 获取Person类的Bean信息
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
// 遍历所有属性
for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
System.out.println("属性名:" + pd.getName());
System.out.println(" 读方法:" + pd.getReadMethod());
System.out.println(" 写方法:" + pd.getWriteMethod());
}
}
}
class Person {
private String name;
private int age;
// getters and setters
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
运行结果会列出所有属性(包括从Object继承的class属性)及其对应的读写方法。
总结
理解JavaBean的定义和规范(私有字段、公开方法、方法命名规范和无参构造)
了解现代IDE和库(如Lombok)显著简化了JavaBean的开发