Что такое Java-эквивалент этого метода отражения C # - PullRequest
0 голосов
/ 04 октября 2018

Я переписываю фреймворк, изначально сделанный в C #, на Java, и это меня озадачилоЭто метод, использующий отражение, чтобы вернуть любое свойство в классе, который реализует определенный интерфейс с использованием LINQ:

public List<TInterface> GetElementsOfType<TInterface>()
{
    return GetType().GetProperties()
        .Where(x => typeof(TInterface).IsAssignableFrom(x.PropertyType))
        .Select(x => x.GetValue(this, null)).OfType<TInterface>()
        .ToList();
}

Я пытаюсь воссоздать в Java и до сих пор есть это.Не слишком уверен, правда ли это?:

public <T> List<?> GetElementsOfType(Class<T> klazz) {
    Class<?> props = this.getClass();
    List<T> elementsOfType = new ArrayList<>();
    try {
            Field fieldlist[] = props.getDeclaredFields();
            for (Field aFieldlist : fieldlist) {
                if (aFieldlist.getType().isAssignableFrom(klazz)){
                    elementsOfType.add((T)aFieldlist);
                }
            }
    } catch (Exception e) {
            return null;
    }
    return elementsOfType;
}

Обновление: Спасибо всем за вашу помощь.Кажется, это работает для меня, хотя непроверенный актерский состав вызывает предупреждение, которое я должен был подавить:

@SuppressWarnings("unchecked")
public <T> List<T> GetElementsOfType(Class<T> klazz) {
    Class<?> props = this.getClass();
    List<T> elementsOfType = new ArrayList<>();
        try {
            Field fieldlist[] = props.getDeclaredFields();
            for (Field aFieldlist : fieldlist) {
                if (klazz.isAssignableFrom(aFieldlist.getType())){
                    elementsOfType.add((T) aFieldlist.get(this));
                }
            }   
        } catch (Exception e) {
          return elementsOfType;
        }

    return elementsOfType;
    }
}

1 Ответ

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

В Java свойство не является полем.Свойство определяется как открытый нестатический метод чтения и, если оно не доступно только для чтения, открытый нестатический метод записи.Экземпляр класса с одним или несколькими такими свойствами известен как Java-бин.

Вы можете проверить свойства с помощью пакета java.beans, начиная с Introspector :

try {
    BeanInfo beanInfo = Introspector.getBeanInfo(props, Object.class);

    for (PropertyDescriptor prop : beanInfo.getPropertyDescriptors()) {
        if (klazz.isAssignableFrom(prop.getPropertyType())) {
            elementsOfType.add(klazz.cast(prop.getReadMethod().invoke(this)));
        }
    }
} catch (IntrospectionException | ReflectiveOperationException e) {
    throw new RuntimeException(e);
}

Поскольку Java использует проверенные исключения, вы не можете легко использовать Streams для написания LINQ-подобного кода в этом случае.Это возможно, но громоздко.И не стоит беспокоиться, учитывая, что приведенный выше код довольно лаконичен.

(Причина для класса Object.class в Introspector.getBeanInfo(klazz, Object.class) заключается в том, что нам не нужны свойства Object, а именно доступ только для чтения class свойство объекта, определенное Object.getClass ().)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...