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

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

例如:

  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. }

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

  1. // 读方法:
  2. public Type getXyz()
  3. // 写方法:
  4. public void setXyz(Type value)

那么这种class被称为JavaBean

上面的字段是xyz,那么读写方法名分别以getset开头,并且后接大写字母开头的字段名Xyz,因此两个读写方法名分别是getXyz()setXyz()

boolean字段比较特殊,它的读方法一般命名为isXyz()

  1. // 读方法:
  2. public boolean isChild()
  3. // 写方法:
  4. public void setChild(boolean value)

我们通常把一组对应的读方法(getter)和写方法(setter)称为属性(property)。例如,name属性:

  • 对应的读方法是String getName()
  • 对应的写方法是setName(String)

只有getter的属性称为只读属性(read-only),例如,定义一个age只读属性:

  • 对应的读方法是int getAge()
  • 无对应的写方法setAge(int)

类似的,只有setter的属性称为只写属性(write-only)。

很明显,只读属性很常见,只写属性不常见。

属性只需要定义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便于传输。此外,JavaBean可以方便地被IDE工具分析,生成读写属性的代码,主要用在图形界面的可视化设计中。

通过IDE,可以快速生成gettersetter。例如,在Eclipse中,先输入以下代码:

  1. public class Person {
  2. private String name;
  3. private int age;
  4. }

然后,点击右键,在弹出的菜单中选择“Source”,“Generate Getters and Setters”,在弹出的对话框中选中需要生成gettersetter方法的字段,点击确定即可由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. }

运行上述代码,可以列出所有的属性,以及对应的读写方法。注意class属性是从Object继承的getClass()方法带来的。

小结

JavaBean是一种符合命名规范的class,它通过gettersetter来定义属性;

属性是一种通用的叫法,并非Java语法规定;

可以利用IDE快速生成gettersetter

使用Introspector.getBeanInfo()可以获取属性列表。