Можно ли отобразить элемент с помощью методов Getter/Setter?

StackOverflow https://stackoverflow.com/questions/20353966

  •  25-08-2022
  •  | 
  •  

Вопрос

Например, у меня есть несколько классов с несколькими полями, один из них, как показано ниже, я хочу вывести все поля его экземпляра, однако я должен получить отображение между именем участника с помощью методов 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();

После этого вы можете получить доступ к Getter и Setter в поле через

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 Beans, где свойства определяются Getters и Setters, но сломается с наивным подходом соответствующих имен.

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