例如,我有一些具有几个字段的类,其中一个是下面的,我想输出其实例的所有字段,但是,我必须使用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;
}
}
有帮助吗?

解决方案

也许这就是您想要的。与 侵入者 你可以得到 Beaninfo 这使您可以访问豆子的 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);
}

其他提示

这是你想要的吗?

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

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

之后,您可以通过

Object value = field.get(objectInstance);

field.set(objetInstance, value);

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

Java中的属性由Getter和/或Setter定义。如果你有 getLength 无参数和返回值的方法,然后您拥有一个可读属性,名称为 length. 。如果您有一种称为的方法 setLength(Type value) 然后,您有一个可写的属性称为 length. 。如果您两者都有,那么该物业既可以阅读又可写。

字段不参与Java属性的定义。如何以及您是否使用字段返回属性取决于您。

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

构成名称的只读属性 doubleLength. 。该属性不存在字段。

因此,您想要的是一般不可能的。如果您想对自己知道存在此映射的特定类别或是否要测试此模式的其他类,则可以通过反射获得方法和字段,并检查是否存在属性名称的字段。

但这可能一直不起作用。有些人使用这样的惯例 _member 或者 mField 对于字段名称。这完全与Java Bean的定义相当,其中属性由Getters和Setter定义,但会破坏匹配名称的幼稚方法。

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                         
                    }
             }                              
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top