通过reflection调用getter的最佳方式

我需要获得具有特定注释的字段的值,所以通过reflection,我可以得到这个字段对象。 问题是,这个领域将永远是私人的,虽然我事先知道它总是有一个getter方法。 我知道我可以使用setAccesible(true)并获取它的值(当没有PermissionManager时),但我更喜欢调用它的getter方法。

我知道我可以通过查找“get + fieldName”来寻找方法(虽然我知道例如布尔字段有时被命名为“is + fieldName”)。

我想知道是否有更好的方法来调用这个getter(许多框架使用getters / setter来访问属性,所以也许他们以另一种方式)。

谢谢

我认为这应该指向你正确的方向:

import java.beans.* for (PropertyDescriptor pd : Introspector.getBeanInfo(Foo.class).getPropertyDescriptors()) { if (pd.getReadMethod() != null && !"class".equals(pd.getName())) System.out.println(pd.getReadMethod().invoke(foo)); } 

请注意,您可以自己创buildBeanInfo或PropertyDescriptor实例,即不使用Introspector。 然而,Introspector在内部做了一些caching,通常是一件好事(tm)。 如果你没有一个caching的快乐,你甚至可以去

 // TODO check for non-existing readMethod Object value = new PropertyDescriptor("name", Person.class).getReadMethod().invoke(person); 

但是,有很多扩展和简化java.beans API的库。 Commons BeanUtils是一个众所周知的例子。 在那里,你只需要做:

 Object value = PropertyUtils.getProperty(person, "name"); 

BeanUtils来与其他方便的东西。 即dynamic值转换(对象到string,string到对象),以简化用户input的设置属性。

你可以使用这个reflection框架

 import static org.reflections.ReflectionUtils.*; Set<Method> getters = ReflectionUtils.getAllMethods(someClass, withModifier(Modifier.PUBLIC), withPrefix("get"), withAnnotation(annotation)); 

命名约定是成熟的JavaBeans规范的一部分,并受java.beans包中的类支持。

您可以调用reflection,也可以通过注释为值的getter设置顺序

 public class Student { private String grade; private String name; private String id; private String gender; private Method[] methods; @Retention(RetentionPolicy.RUNTIME) public @interface Order { int value(); } /** * Sort methods as per Order Annotations * * @return */ private void sortMethods() { methods = Student.class.getMethods(); Arrays.sort(methods, new Comparator<Method>() { public int compare(Method o1, Method o2) { Order or1 = o1.getAnnotation(Order.class); Order or2 = o2.getAnnotation(Order.class); if (or1 != null && or2 != null) { return or1.value() - or2.value(); } else if (or1 != null && or2 == null) { return -1; } else if (or1 == null && or2 != null) { return 1; } return o1.getName().compareTo(o2.getName()); } }); } /** * Read Elements * * @return */ public void readElements() { int pos = 0; /** * Sort Methods */ if (methods == null) { sortMethods(); } for (Method method : methods) { String name = method.getName(); if (name.startsWith("get") && !name.equalsIgnoreCase("getClass")) { pos++; String value = ""; try { value = (String) method.invoke(this); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } System.out.println(name + " Pos: " + pos + " Value: " + value); } } } // /////////////////////// Getter and Setter Methods /** * @param grade * @param name * @param id * @param gender */ public Student(String grade, String name, String id, String gender) { super(); this.grade = grade; this.name = name; this.id = id; this.gender = gender; } /** * @return the grade */ @Order(value = 4) public String getGrade() { return grade; } /** * @param grade the grade to set */ public void setGrade(String grade) { this.grade = grade; } /** * @return the name */ @Order(value = 2) public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the id */ @Order(value = 1) public String getId() { return id; } /** * @param id the id to set */ public void setId(String id) { this.id = id; } /** * @return the gender */ @Order(value = 3) public String getGender() { return gender; } /** * @param gender the gender to set */ public void setGender(String gender) { this.gender = gender; } /** * Main * * @param args * @throws IOException * @throws SQLException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException */ public static void main(String args[]) throws IOException, SQLException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Student student = new Student("A", "Anand", "001", "Male"); student.readElements(); } 

}

sorting时输出

 getId Pos: 1 Value: 001 getName Pos: 2 Value: Anand getGender Pos: 3 Value: Male getGrade Pos: 4 Value: A