有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中使用反射获取无效的类名

我在代码中使用java反射,并在类中进行迭代。 在迭代中,我得到一个特定对象的无效类名。 PFB反射代码和我得到的日志

伐木工人:

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) 个答案

  1. # 1 楼答案

    正如在注释中指出的,代码失败的类不是因为类名错误,而是因为它是一个javaassist代理类。据我所知,javaassist仅通过创建子类来代理,因此如果您知道该类是代理,那么只需调用Class.getSuperclass()。为了检索原始类,javaassist代理都实现javassist Proxy接口,因此类似这样的东西可能会满足您的需要:

    Class<?> classA = object.getClass();
    if(javassist.util.proxy.Proxy.isAssignableFrom(classA)) {
        classA = classA.getSuperclass();
    }
    
  2. # 2 楼答案

    if (object instanceof HibernateProxy) {
                object = ((HibernateProxy) object).getHibernateLazyInitializer()
                        .getImplementation();
            }
    

    这段代码对我有用

  3. # 3 楼答案

    您的对象应该是由spring生成的动态代理目标(我猜,因为没有相关代码)

    那你可以试试这个

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

    AopUtils在org下。springframework。aop。支持