Pergunta

Por exemplo, eu tenho algumas classes com vários campos, uma delas é como abaixo, eu quero produzir todos os campos de sua instância; no entanto, devo obter o mapeamento entre o nome do membro com os métodos getter, posso obtê -lo por reflexão?

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;
}
}
Foi útil?

Solução

Talvez seja isso que você quer. Com o Introspector você pode obter o Beaninfo E isso lhe dá acesso ao feijão PropertyDescriptores.

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);
}

Outras dicas

É isso que voce quer?

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

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

Depois disso, você pode acessar o getter e o setter do campo via

Object value = field.get(objectInstance);

field.set(objetInstance, value);

onde o ObjectInstance é uma instância da classe que possui o campo.

Uma propriedade em Java é definida por Getter e/ou Setter. Se você tem um getLength Método sem parâmetro e com um valor de retorno, então você tem uma propriedade legível nomeada length. Se você tem um método chamado setLength(Type value) Então você tem uma propriedade escrita chamada length. Se você possui os dois, a propriedade é legível e gravável.

Os campos não estão envolvidos na definição de uma propriedade Java. Como e se você apoiar suas propriedades com campos depende de você.

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

constitui uma propriedade somente leitura de nome doubleLength. Não existe campo para esta propriedade.

Então, o que você quer não é possível em geral. Se você deseja fazer isso para classes próprias específicas, onde você sabe que esse mapeamento existe ou se deseja testar outras classes para esse padrão, poderá obter métodos e campos por meio de reflexão e verificar se existem campos com os nomes de propriedades.

Mas isso pode não funcionar o tempo todo. Algumas pessoas usam convenções como _member ou mField para os nomes de campo. Isso está completamente a par da definição de feijões Java, onde as propriedades são definidas por getters e setters, mas quebram com a abordagem ingênua de nomes correspondentes.

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                         
                    }
             }                              
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top