Получение неверного имени класса с помощью отражения в Java - PullRequest
0 голосов
/ 26 декабря 2018

Я использую Java-отражение в своем коде и выполняю итерации внутри класса.На итерации я получаю недопустимое имя класса для определенного объекта.PFB код отражения и журналы, которые я получаю.

LOGGERS:

2018-12-26 12:38:04,878 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- given class is : class com.paytm.oe.entity.RelatedBusinessSolutionMapping_$$_jvst3bb_5e
2018-12-26 12:38:04,879 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- fields are : private javassist.util.proxy.MethodHandler com.paytm.oe.entity.RelatedBusinessSolutionMapping_$$_jvst3bb_5e.handler
2018-12-26 12:38:04,879 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- fields are : public static byte[] com.paytm.oe.entity.RelatedBusinessSolutionMapping_$$_jvst3bb_5e._filter_signature
2018-12-26 12:38:04,879 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- fields are : public static final long com.paytm.oe.entity.RelatedBusinessSolutionMapping_$$_jvst3bb_5e.serialVersionUID
2018-12-26 12:38:04,879 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- fields are : private static java.lang.reflect.Method[] com.paytm.oe.entity.RelatedBusinessSolutionMapping_$$_jvst3bb_5e._methods_
2018-12-26 12:38:04,879 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- field is : handler path is : relatedBusinessSolutionMapping
2018-12-26 12:38:04,879 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- field is : _filter_signature path is : relatedBusinessSolutionMapping
2018-12-26 12:38:04,880 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- field is : serialVersionUID path is : relatedBusinessSolutionMapping
2018-12-26 12:38:04,880 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- field is : _methods_ path is : relatedBusinessSolutionMapping
2018-12-26 12:38:04,880 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- field is : solutionType path is : null
2018-12-26 12:38:04,880 INFO  [http-nio-8180-exec-4] [] [] [diy-CJ] []- Path in non-primitive type is : null for field : solutionType

Как вы можете видеть, первая строка регистратора печатает имя классакак: com.paytm.oe.entity.RelatedBusinessSolutionMapping_$$_jvst3bb_5e, которое вместо этого должно быть:

com.paytm.oe.entity.RelatedBusinessSolutionMapping

Код для отражения:

public static void setNullFieldInAnObject(Object object, Set<String> value, String path) throws Exception {
    LOGGER.info("In merge diff according to the given set function");
    LOGGER.info("Set is : " + value);
    LOGGER.info("Object is : " + object.toString());
    Class classA = object.getClass();
    LOGGER.info("given class is : " + classA.toString());
    Field fields[] = classA.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        LOGGER.info("fields are : " + fields[i].toString());
    }
}

Только в этом случае дает неправильный классимя, которое мешает мне повторяться внутри класса . Для всех остальных случаев работает нормально.Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Как указано в комментариях, класс, в котором ваш код не выполняется, не потому, что имя класса неверно, а потому, что это прокси-класс javaassist.Насколько я знаю, javaassist только прокси, создавая подклассы, поэтому, если вы знаете, что класс является прокси, вам просто нужно вызвать Class.getSuperclass().Чтобы получить исходный класс, все прокси-серверы javaassist реализуют интерфейс javassist Proxy, поэтому что-то вроде этого, вероятно, делает то, что вы хотите:

Class<?> classA = object.getClass();
if(javassist.util.proxy.Proxy.isAssignableFrom(classA)) {
    classA = classA.getSuperclass();
}
0 голосов
/ 03 января 2019
if (object instanceof HibernateProxy) {
            object = ((HibernateProxy) object).getHibernateLazyInitializer()
                    .getImplementation();
        }

Этот кусок кода работал для меня!

0 голосов
/ 26 декабря 2018

ваш объект должен быть динамическим прокси-объектом, который генерируется пружиной (я думаю, потому что нет относительного кода).

тогда вы можете попробовать это

Class clazz = AopUtils.getTargetClass(proxy);
Arrays.stream(clazz.getDeclaredFields()).forEach(field -> System.out.println(field.getName()));

AopUtils находится подorg.springframework.aop.support

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