Java创建学生对象,包括姓名、年龄、住址、出生年月等属性,模拟生成学生集合,基于字段注解、打印输出该集合,要求输出的第一行数据为字段名称、后续行数据为集合数据
时间: 2023-06-07 15:07:47 浏览: 88
基于java和mysql的学生信息管理系统.doc
很高兴能够为您解答问题。以下是代码实现及注释:
``` java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* 定义注解,用于标注成员变量
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface StudentField {
String value() default "";
}
/**
* 定义学生类,包括姓名、年龄、住址、出生年月四个成员变量
*/
class Student {
@StudentField("姓名")
private String name;
@StudentField("年龄")
private int age;
@StudentField("住址")
private String address;
@StudentField("出生年月")
private String birth;
public Student(String name, int age, String address, String birth) {
this.name = name;
this.age = age;
this.address = address;
this.birth = birth;
}
// toString方法用于输出成员变量的值
@Override
public String toString() {
return name + "\t" + age + "\t" + address + "\t" + birth;
}
}
/**
* 定义工具类,用于生成学生集合并打印
*/
class StudentUtil {
/**
* 生成学生集合
*/
public static List<Student> generateStudents() {
List<Student> students = new ArrayList<>();
students.add(new Student("Tom", 18, "北京市海淀区", "2003-01-01"));
students.add(new Student("Jerry", 19, "北京市朝阳区", "2002-02-02"));
students.add(new Student("Mike", 20, "上海市浦东区", "2001-03-03"));
return students;
}
/**
* 打印学生集合
*/
public static void printStudents(List<Student> students) {
if (students == null || students.isEmpty()) {
System.out.println("The student collection is empty.");
return;
}
// 获取学生类的所有成员变量
Field[] fields = Student.class.getDeclaredFields();
// 定义输出字符串,其中第一行为成员变量名,后续行为成员变量的值
StringBuilder sb = new StringBuilder();
for (Field field : fields) {
// 判断成员变量是否被@StudentField注解所标注
if (field.isAnnotationPresent(StudentField.class)) {
// 获取@StudentField注解的值,如果没设置则使用成员变量名作为注解值
String fieldName = field.getAnnotation(StudentField.class).value();
if (fieldName.isEmpty()) {
fieldName = field.getName();
}
// 拼接成员变量名到输出字符串
sb.append(fieldName).append("\t");
}
}
// 输出字段名称
System.out.println(sb);
// 遍历学生集合,并输出成员变量的值
for (Student student : students) {
sb = new StringBuilder();
for (Field field : fields) {
if (field.isAnnotationPresent(StudentField.class)) {
// 获取成员变量的值,利用反射机制
try {
Object value = field.get(student);
sb.append(value).append("\t");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
System.out.println(sb);
}
}
}
public class Main {
public static void main(String[] args) {
// 生成学生集合
List<Student> students = StudentUtil.generateStudents();
// 打印学生集合
StudentUtil.printStudents(students);
}
}
```
运行上述代码,将会得到以下输出:
```
姓名 年龄 住址 出生年月
Tom 18 北京市海淀区 2003-01-01
Jerry 19 北京市朝阳区 2002-02-02
Mike 20 上海市浦东区 2001-03-03
```
以上是用 Java 创建学生对象、生成学生集合,并利用注解@StudentField和反射机制,实现了字段注解、打印输出该集合的需求。感谢您的提问,希望能帮到您!
阅读全文