Проблема
Я работаю над проектом, в котором мне приходится много работать с отражениями, и производительность необходимо улучшить. Этот метод вызывается очень часто, и эта часть кажется мне неэффективной, поскольку мне нужно получить поле с помощью другого отражения, которое мне нужно только для сравнения параметров типа двух объектов (я не знаю, насколько это неэффективно на самом деле tbh). Потому что мне нужен List
Текущее решение
Я знаю, что этот код прямо сейчас противоречит любым соглашениям о кодировании на этой планете, это просто эксперимент.
Этот метод в основном вызывает установщик PropertyDescriptor со значением получателя PropertyDescriptor в качестве аргумента, это должно происходить только в том случае, если их классы одинаковы, в противном случае я хочу относиться к ним по-другому, однако я столкнулся с некоторыми проблемами со списками, наборами, и т.д., где List
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 всего времени, которое занимает мой код, что слишком много для небольшой проверки.