public class Product{
private String id;
private String name;
private String description;
// Getters and setters..
}
Из приведенного выше класса я хочу получить имя поля описания во время выполнения:
Query query = new Query();
if (productSearchCriteria.getDescription().isPresent()) {
query.addCriteria(Criteria.where("description").is(productSearchCriteria.getDescription().get()));
}
В настоящее время я жестко запрограммировал имя, но оно должно быть динамическим, потому что, если кто-то переименует или изменит имя свойства, это не сработает.
Осматриваясь, я нашел библиотеку reflection-util.
String numberProperty = PropertyUtils.getPropertyName(Product.class, Product::getDescription);
Это дало мне исключение:
Caused by: java.lang.ClassCastException: class domain.Product$ByteBuddy$QIcFk1aK cannot be cast to class domain.Product (domain.Product$ByteBuddy$QIcFk1aK is in unnamed module of loader net.bytebuddy.dynamic.loading.ByteArrayClassLoader @33943b71; domain.Product is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @5be4b0e6)
at de.cronn.reflection.util.PropertyUtils.findMethodByGetter(PropertyUtils.java:322) ~[reflection-util-2.6.0.jar:na]
at de.cronn.reflection.util.PropertyDescriptorCache.lambda$getMethod$4(PropertyDescriptorCache.java:178) ~[reflection-util-2.6.0.jar:na]
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) ~[na:na]
at de.cronn.reflection.util.PropertyDescriptorCache.getMethod(PropertyDescriptorCache.java:178) ~[reflection-util-2.6.0.jar:na]
at de.cronn.reflection.util.PropertyUtils.getMethod(PropertyUtils.java:315) ~[reflection-util-2.6.0.jar:na]
at de.cronn.reflection.util.PropertyUtils.getPropertyDescriptor(PropertyUtils.java:282) ~[reflection-util-2.6.0.jar:na]
at de.cronn.reflection.util.PropertyUtils.getPropertyName(PropertyUtils.java:290) ~[reflection-util-2.6.0.jar:na]
at fete.bird.fetebirdproduct.common.querybuilder.QueryBuilder.BuildQuery(QueryBuilder.java:24) ~[main/:na]
at fete.bird.fetebirdproduct.service.consumer.ProductListener.GetProducts(ProductListener.java:56) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at ... 9 common frames omitted
Я использую JDK 14. Я знаю, что есть API отражения Java. Я не могу жестко закодировать имя поля.
Есть ли решение?
PropertyUtils.class.getClassLoader()
вместоbeanClass.getClassLoader()
. Но учитывая, что автор этой библиотеки, похоже, не знает оClassValue
, но кэширует вещи в обычных картах вstatic
полях, я могу только отговорить его от использования в среде с динамической (повторной) загрузкой кода. - person Holger   schedule 28.08.2020