指定可以通过反射获得对象中的哪些字段

时间:2013-06-19 19:17:06

标签: java reflection

我有一些看起来像这样的课程

class Person {

  public String name;
  public String age;
  public String dateOfBirth;

  /* more fields */

  public String[] fieldsToReflect()
  {
     return new String[] { "name", "age"}
  }
}

class Vehicle {

  public String make;
  public String model;
  public String mileage;

  /* more fields */

  public String[] fieldsToReflect()
  {
    return new String[] { "make", "model" }
  }
}

Person个对象包含多个字段,但在从Person的实例中获取字段时,我只想让其他人访问nameage

由于我可能正在使用任意对象(例如:Vehicle对象),我认为统一处理应用程序中所有对象的最简单方法是让每个对象告诉我哪些字段可以得到来自他们。

在控制从对象中检索哪些字段时,我还可以考虑其他方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用注释,例如

@ReflectableFields({"name", "age"})
class Person {

    public String name;
    public String age;
    public String dateOfBirth;

}

@ReflectableFields定义为

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ReflectableFields {
    String[] value();
}

或按字段分类:

class Person {

    @Reflectable
    public String name;

    @Reflectable
    public String age;      
    public String dateOfBirth;

}

@Reflectable定义为

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Reflectable {
    // No field needed
}

第一个解决方案不那么冗长,但注释中的名称必须与字段名称一起更新。第二个解决方案似乎更冗长,但字段名称不需要明确。