在Java(7)中,如何获取带注释字段的值

在Java(7)中,如何获取带注释字段的值,java,annotations,Java,Annotations,我有一个带有字段的类,其中一些字段使用自定义注释进行注释。我有一个方法需要检索实例化类中这些字段的值: public void displayStringValue(Row row) for (Field field : Row.class.getDeclaredFields()) { SomeAnnotation annotatedElement = field.getAnnotation(SomeAnnotation.class); if (annot

我有一个带有字段的类,其中一些字段使用自定义注释进行注释。我有一个方法需要检索实例化类中这些字段的值:

public void displayStringValue(Row row)
    for (Field field : Row.class.getDeclaredFields()) {
        SomeAnnotation annotatedElement = field.getAnnotation(SomeAnnotation.class);
        if (annotatedElement != null) {
            row.getValue(field.getName()); // What to do here in stead of this?
        }
    }
}
显然,row.getValueString字段名;不存在。在这里,我需要找到一种方法来获取行中该字段的值。

是否要获取给定行对象的字段值

如果该字段在调用类中不可见,则为必需的。

是否要为给定的行对象指定该字段的值


如果该字段在调用类中不可见,则为必选项。

如果该字段为私有字段,则为右。不过,根据上下文的不同,您可能需要检查是否有用于此类字段的getter方法,并调用它。因为直接访问私有字段在某种程度上违反了契约,可能会破坏类中实现的任何逻辑。对于那些试图在Java中模仿Scala中的不可变对象的人来说尤其如此。@okiharaherbst如果一个人真的需要通过反射来获取私有字段的值,那么他通常会遵循类的约定。否则的话,你就误用了这个特性,不得不忍受可能的后果。有效使用的一个很好的例子是接口的静态SerialVersionId字段。@Balder:SerialVersionId是最终的,这使得直接访问该字段不仅安全而且非常合法。在某些情况下——对于可变类——使用反射检查字段,然后再次使用反射查找要调用的相应getter。所有这些都是反射性的,因此在编译时不为人所知。@Balder:另外,请记住,您可能正在使用代理实例,如果您直接拨弄字段,其逻辑几乎总是会崩溃。@okiharaherbst您当然是对的,但在您提到的情况下,您还遵循一些约定,即如果可能的话,公共getter应该始终访问某个私有字段。另一方面,例如,如果您正在序列化/反序列化对象并在执行此操作时访问它们的私有实例字段,则通常不建议通过它们的公共API访问这些字段。这就是我的意思,一个通常遵循类的契约。对,如果字段是私有的。不过,根据上下文的不同,您可能需要检查是否有用于此类字段的getter方法,并调用它。因为直接访问私有字段在某种程度上违反了契约,可能会破坏类中实现的任何逻辑。对于那些试图在Java中模仿Scala中的不可变对象的人来说尤其如此。@okiharaherbst如果一个人真的需要通过反射来获取私有字段的值,那么他通常会遵循类的约定。否则的话,你就误用了这个特性,不得不忍受可能的后果。有效使用的一个很好的例子是接口的静态SerialVersionId字段。@Balder:SerialVersionId是最终的,这使得直接访问该字段不仅安全而且非常合法。在某些情况下——对于可变类——使用反射检查字段,然后再次使用反射查找要调用的相应getter。所有这些都是反射性的,因此在编译时不为人所知。@Balder:另外,请记住,您可能正在使用代理实例,如果您直接拨弄字段,其逻辑几乎总是会崩溃。@okiharaherbst您当然是对的,但在您提到的情况下,您还遵循一些约定,即如果可能的话,公共getter应该始终访问某个私有字段。另一方面,例如,如果您正在序列化/反序列化对象并在执行此操作时访问它们的私有实例字段,则通常不建议通过它们的公共API访问这些字段。这就是我的意思,不管怎样,一个人通常遵守班级的合同。
field.setAccessible(true);
Object fieldValue = field.get(row); // or cast it if you know the type