BLOG

Java核心类——5.JavaBean

目录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的开发