使用 Java 注解实现手机号校验

在 Java 中,我们可以使用自定义注解(Annotation)和反射(Reflection)来实现手机号的校验功能。以下是整个实现流程的概述:

步骤 描述
1 定义手机号校验注解
2 创建实体类并使用该注解
3 使用反射在运行时校验手机号
4 编写测试代码以验证实现

接下来,我们一一解释每个步骤及相应的代码。

步骤 1: 定义手机号校验注解

首先,我们需要定义一个注解,命名为 @Phone,用于标识需要校验的手机号字段。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 声明注解的作用目标为字段
@Target(ElementType.FIELD)
// 指定注解在运行时仍然可用
@Retention(RetentionPolicy.RUNTIME)
public @interface Phone {
    String message() default "手机号格式不正确"; // 默认的错误提示信息
}

步骤 2: 创建实体类并使用该注解

接下来,创建一个实体类,例如 User,在需要校验手机号的字段上使用我们定义的 @Phone 注解。

public class User {
    @Phone(message = "用户手机号无效")
    private String phoneNumber; // 用户手机号

    public User(String phoneNumber) {
        this.phoneNumber = phoneNumber; // 构造函数
    }

    public String getPhoneNumber() {
        return phoneNumber; // 获取手机号
    }
}

步骤 3: 使用反射在运行时校验手机号

我们需要创建一个校验器,通过反射机制检测字段是否使用了 @Phone 注解,并进行手机号格式的验证。

import java.lang.reflect.Field;
import java.util.regex.Pattern;

public class Validator {
    // 用于手机号校验的正则表达式
    private static final Pattern PHONE_PATTERN = Pattern.compile("^[1][3-9][0-9]{9}$");

    // 校验方法
    public static void validate(Object obj) throws IllegalAccessException {
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            // 检查字段是否带有 @Phone 注解
            if (field.isAnnotationPresent(Phone.class)) {
                field.setAccessible(true); // 允许访问私有字段
                String value = (String) field.get(obj);
                // 检查手机号格式
                if (!PHONE_PATTERN.matcher(value).matches()) {
                    Phone annotation = field.getAnnotation(Phone.class);
                    throw new IllegalArgumentException(annotation.message());
                }
            }
        }
    }
}

步骤 4: 编写测试代码以验证实现

最后,编写测试代码,创建 User 对象并进行手机号校验。

public class Main {
    public static void main(String[] args) {
        try {
            User user1 = new User("13912345678"); // 有效手机号
            Validator.validate(user1); // 校验
            System.out.println("手机号校验通过!");

            User user2 = new User("123456"); // 无效手机号
            Validator.validate(user2); // 校验
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage()); // 输出错误信息
        } catch (IllegalAccessException e) {
            e.printStackTrace(); // 输出堆栈信息
        }
    }
}

状态图

下面是使用 mermaid 语法表示的状态图,描述正在进行的手机号校验状态。

stateDiagram
    [*] --> 创建用户
    创建用户 --> 校验手机号
    校验手机号 --> 校验通过
    校验手机号 --> 校验失败
    校验通过 --> [*]
    校验失败 --> [*]

结论

通过以上步骤,我们实现了一个简单的手机号校验功能,使用了 Java 的注解机制和反射特性。这种方法不仅避免了硬编码校验逻辑,还使得代码更加灵活和可维护。

希望这篇文章能帮助你理解如何使用 Java 注解进行手机号校验。如果你有任何问题或想要进一步深入学习,请随时提问。