是否可以使用getter / setter方法映射成员?

时间:2013-12-03 14:34:20

标签: java reflection

例如,我有一些包含多个字段的类,其中一个如下所示,我想输出其实例的所有字段,但是,我必须使用getter方法获取成员名称之间的映射,我可以得到它通过反思?

public class MappingMemberWithGetterOrSetter {
private String memberOne;
private int memberTwo;

public String getMemberOne() {
    return memberOne;
}

public void setMemberOne(String memberOne) {
    this.memberOne = memberOne;
}

public int getMemberTwo() {
    return memberTwo;
}

public void setMemberTwo(int memberTwo) {
    this.memberTwo = memberTwo;
}
}

4 个答案:

答案 0 :(得分:2)

也许这就是你想要的。使用Introspector,您可以获得BeanInfo,这样您就可以访问bean的PropertyDescriptors

BeanInfo beanInfo = Introspector.getBeanInfo(MappingMemberWithGetterOrSetter.class, Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
    String propertyName = propertyDescriptor.getName();
    Method getter = propertyDescriptor.getReadMethod();
    Method setter = propertyDescriptor.getWriteMethod();
    Field field = MappingMemberWithGetterOrSetter.class
                .getDeclaredField(propertyName);
    System.out.println("Property " + propertyName + " field:  " + field);
    System.out.println("Getter " + getter);
    System.out.println("Setter " + setter);
}

答案 1 :(得分:0)

这是你想要的吗?

Class aClass = ...//obtain class object
Field[] methods = aClass.getFields(); 

Field field = ... //obtain field object
String fieldName = field.getName();

之后,您可以通过

访问该字段的getter和setter
Object value = field.get(objectInstance);

field.set(objetInstance, value);

其中objectInstance是拥有该字段的类的实例。

答案 2 :(得分:0)

public void getMethods(Class<?> className)
{                   
         Method[] methods = className.getMethods();             
         for(Method method : methods)
            {
           if(method.getDeclaringClass().getName().equalsIgnoreCase("java.lang.Object") )
             {
                 //Do nothing
             }
             else
             {
                if(StringUtils.startsWith( method.getName(),"get"))
                    {   
                        //Here u ll get all get methods                         
                    }
             }                              
}

答案 3 :(得分:0)

Java中的属性由getter和/或setter定义。如果你有一个没有参数的getLength方法并且返回值,那么你有一个名为length的可读属性。如果您有一个名为setLength(Type value)的方法,那么您将拥有一个名为length的可写属性。如果你有两个属性,那么该属性是可读写的。

字段不参与Java属性的定义。如何以及如果您使用字段支持您的属性取决于您。

public long getDoubleLength() { return getLength()*2; }

构成名称doubleLength的只读属性。此属性不存在任何字段。

所以你想要的一般是不可能的。如果你想知道这个映射存在的特定自己的类,或者你想测试这个模式的其他类,那么你可以通过反射获取方法和字段,并检查是否存在具有属性名称的字段。

但这可能不会一直有效。有些人使用_membermField等惯例作为字段名称。这与Java Beans定义完全相同,其中属性由getter和setter定义,但会破坏匹配名称的天真方法。