### JavaBean
在Java中,有很多`class`的定义都符合这样的规范:
- 若干`private`实例字段;
- 通过`public`方法来读写实例字段。
```java
public class Person {
private String name;
private int age;
public String getName() { return this.name; }
public void setName(String name) { this.name = name; }
public int getAge() { return this.age; }
public void setAge(int age) { this.age = age; }
}
```
如果读写方法符合以下这种命名规范:
```java
// 读方法:
public Type getXyz()
// 写方法:
public void setXyz(Type value)
```
那么这种`class`被称为`JavaBean`
上面的字段是`xyz`,那么读写方法名分别以`get`和`set`开头,并且后接大写字母开头的字段名`Xyz`,因此两个读写方法名分别是`getXyz()`和`setXyz()`。`boolean`字段比较特殊,它的读方法一般命名为`isXyz()`
我们通常把一组对应的读方法(`getter`)和写方法(`setter`)称为属性(`property`),只有`getter`的属性称为只读属性(read-only),只有`setter`的属性称为只写属性(write-only)。属性只需要定义`getter`和`setter`方法,不一定需要对应的字段。
可以看出,`getter`和`setter`也是一种数据封装的方法
### JavaBean的作用
JavaBean主要用来传递数据,即把一组数据组合成一个JavaBean便于传输。此外,JavaBean可以方便地被IDE工具分析,生成读写属性的代码,主要用在图形界面的可视化设计中。
通过IDE,可以快速生成`getter`和`setter`。
### 枚举JavaBean属性
要枚举一个JavaBean的所有属性,可以直接使用Java核心库提供的`Introspector`:
```java
public class Main {
public static void main(String[] args) throws Exception {
BeanInfo info = Introspector.getBeanInfo(Person.class);
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
System.out.println(pd.getName());
System.out.println(" " + pd.getReadMethod());
System.out.println(" " + pd.getWriteMethod());
}
}
}
class Person {
private String name;
private int age;
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;
}
}
```