定义

在Java中,有很多 class 的定义都符合这样的规范:

  • 若干 private 实例字段;
  • 通过 public 方法来读写实例字段。

如果读写方法符合以下这种命名规范:

  • public Type getXyz()
  • public void setXyz(Type value)

那么这种 class 被称为 JavaBean
boolean 字段比较特殊,它的读方法一般命名为 isXyz()

我们通常把一组对应的读方法(getter)和写方法(setter)称为属性(property)。属性只需要定义 gettersetter 方法,不一定需要对应的字段。例如,child 只读属性定义如下:

  1. public class Person {
  2. private String name;
  3. private int age;
  4. public String getName() { return this.name; }
  5. public void setName(String name) { this.name = name; }
  6. public int getAge() { return this.age; }
  7. public void setAge(int age) { this.age = age; }
  8. public boolean isChild() {
  9. return age <= 6;
  10. }
  11. }

可以看出,gettersetter 也是一种数据封装的方法。
JavaBean主要用来传递数据,即把一组数据组合成一个JavaBean便于传输。此外,JavaBean可以方便地被IDE工具分析,生成读写属性的代码,主要用在图形界面的可视化设计中。

枚举JavaBean属性

要枚举一个JavaBean的所有属性,可以直接使用Java核心库提供的Introspector:

  1. import java.beans.*;
  2. public class Main {
  3. public static void main(String[] args) throws Exception {
  4. BeanInfo info = Introspector.getBeanInfo(Person.class);
  5. for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
  6. System.out.println(pd.getName());
  7. System.out.println(" " + pd.getReadMethod());
  8. System.out.println(" " + pd.getWriteMethod());
  9. }
  10. }
  11. }
  12. class Person {
  13. private String name;
  14. private int age;
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public int getAge() {
  22. return age;
  23. }
  24. public void setAge(int age) {
  25. this.age = age;
  26. }
  27. }