Java: неэффективный код для получения ParameterizedType из PropertyDescriptor

Проблема

Я работаю над проектом, в котором мне приходится много работать с отражениями, и производительность необходимо улучшить. Этот метод вызывается очень часто, и эта часть кажется мне неэффективной, поскольку мне нужно получить поле с помощью другого отражения, которое мне нужно только для сравнения параметров типа двух объектов (я не знаю, насколько это неэффективно на самом деле tbh). Потому что мне нужен List .class! = List .class.

Текущее решение

Я знаю, что этот код прямо сейчас противоречит любым соглашениям о кодировании на этой планете, это просто эксперимент.

Этот метод в основном вызывает установщик PropertyDescriptor со значением получателя PropertyDescriptor в качестве аргумента, это должно происходить только в том случае, если их классы одинаковы, в противном случае я хочу относиться к ним по-другому, однако я столкнулся с некоторыми проблемами со списками, наборами, и т.д., где List совпадает с List , чего не должно быть. Вот почему я получаю ParameterizedType полей, чтобы сравнить их параметры типа.

protected boolean translate(S source, T target) {
   Class<?> readPropertyType = getter.getPropertyType();
        Class<?> writePropertyType = setter.getPropertyType();

        Type[] getterTypeParameters = null;
        Type[] setterTypeParameters = null;;

        try {
            ParameterizedType getterParameterizedType = (ParameterizedType) source.getClass()
                .getDeclaredField(getter.getName()).getGenericType();
            getterTypeParameters = getterParameterizedType.getActualTypeArguments();

            ParameterizedType setterParameterizedType = (ParameterizedType) target.getClass()
               .getDeclaredField(setter.getName()).getGenericType();
            setterTypeParameters = setterParameterizedType.getActualTypeArguments();
        } catch (NoSuchFieldException | ClassCastException e) {}

        try {
            if (readPropertyType == writePropertyType && Arrays.equals(getterTypeParameters, setterTypeParameters)) {
                setter.getWriteMethod().invoke(target, getter.getReadMethod().invoke(source));

                return true;
            }

            ... Handle other cases
        } catch (Exception e) {
            return false;
        }

}

Если вам нужно больше контекста, я сделал свой git общедоступным: https://github.com/RaphaelEckmayr/AnotherJavaAutoMapper/blob/main/src/main/java/net/AJAM/Mapper/BaseTranslation.java

Для справки этот код занимает около 0-1 мс. Однако он вызывается почти для каждого поля класса. Это составляет примерно 1/8 всего времени, которое занимает мой код, что слишком много для небольшой проверки.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *