почему метод по умолчанию не распознается как свойство (getter / setter)? - PullRequest
0 голосов
/ 29 октября 2018

Интерфейс:

public interface SomeInt{
   Integer getX();
   void setX(Integer value);
   default Integer getY(){
      return getX();
   }
   default void setY(Integer value){
       setX(value);
   }
}

Класс реализует это:

public class A implements SomeInt{
  private Integer x;
  public Integer getX(){
     return x;
  }
  public void setX(Integer value){
     x = value;
  }
}

При инициализации я могу вызвать метод get Y и установить Y и получить правильный возврат. Но я не могу использовать его в JSP ( EL ), как ${instance_of_class_a.y}. А свойство Y отсутствует в списке переменных IDEA (режим отладки).

Если я добавлю getY & setY явно в класс A, все будет в порядке. Зачем? Я думаю, что метод по умолчанию похож на сахар компилятора.

Извините за мой плохой английский и ошибки в коде, я исправил это.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я думаю, что получил ответ.

BeanELResover с использованием java.beans.Introspector для getBeanInfo (Свойства)

public static BeanInfo getBeanInfo(Class<?> beanClass)
        throws IntrospectionException
    {
        if (!ReflectUtil.isPackageAccessible(beanClass)) {
            return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo();
        }
        ThreadGroupContext context = ThreadGroupContext.getContext();
        BeanInfo beanInfo;
        synchronized (declaredMethodCache) {
            beanInfo = context.getBeanInfo(beanClass);
        }
        if (beanInfo == null) {
            beanInfo = new Introspector(beanClass, null, USE_ALL_BEANINFO).getBeanInfo();
            synchronized (declaredMethodCache) {
                context.putBeanInfo(beanClass, beanInfo);
            }
        }
        return beanInfo;
    }

Конструктор Introspector вызывает метод "findExplicitBeanInfo", чтобы получить методDeclaredMethods текущего класса. Затем сделайте это с его суперклассом до Object или stopClass. Метод интерфейсов здесь не загружается.

private Introspector(Class<?> beanClass, Class<?> stopClass, int flags)
                                        throws IntrospectionException {
    this.beanClass = beanClass;

    // Check stopClass is a superClass of startClass.
    if (stopClass != null) {
        boolean isSuper = false;
        for (Class<?> c = beanClass.getSuperclass(); c != null; c = c.getSuperclass()) {
            if (c == stopClass) {
                isSuper = true;
            }
        }
        if (!isSuper) {
            throw new IntrospectionException(stopClass.getName() + " not superclass of " +
                                    beanClass.getName());
        }
    }

    if (flags == USE_ALL_BEANINFO) {
        explicitBeanInfo = findExplicitBeanInfo(beanClass);
    }

    Class<?> superClass = beanClass.getSuperclass();
    if (superClass != stopClass) {
        int newFlags = flags;
        if (newFlags == IGNORE_IMMEDIATE_BEANINFO) {
            newFlags = USE_ALL_BEANINFO;
        }
        superBeanInfo = getBeanInfo(superClass, stopClass, newFlags);
    }
    if (explicitBeanInfo != null) {
        additionalBeanInfo = explicitBeanInfo.getAdditionalBeanInfo();
    }
    if (additionalBeanInfo == null) {
        additionalBeanInfo = new BeanInfo[0];
    }
}
0 голосов
/ 29 октября 2018

Вопрос немного плохо написан, поэтому, возможно, что-то пошло не так. Особенно добавить @Override для опечаток.

interface SomeInt {
    int getX();

    void setX(int x);

    default int getY() {
        return getX();
    }

    default void setY(int value) {
        setX(value);
    }
}

static class A implements SomeInt {
    private int x;

    @Override
    public int getX() {
        return x;
    }

    @Override
    public void setX(int value) {
        x = value;
    }
}

    System.out.println("Methods:");
    for (Method m : A.class.getMethods()) {
        System.out.printf("+ %s%n", m.getName());
    }
    for (Method m : A.class.getDeclaredMethods()) {
        System.out.printf("- %s%n", m.getName());
    }

Обычно для геттеров / сеттеров * используется 1005 *.

Methods:
+ setX
+ getX
...
+ setY
+ getY
- setX
- getX
...