【发布时间】:2018-12-26 07:26:19
【问题描述】:
我在我的代码中使用 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());
}
}
只有在这种情况下它给出了一个错误的类名,这会阻碍我在类中进行迭代。对于所有其他情况,它工作正常。 请帮忙。
【问题讨论】:
-
莫非这个类是匿名类? --- 对您的代码的注释:
Field fields[] = classA.getDeclaredFields();- 在 Java 中强烈建议不要使用 C 风格的数组声明。数组括号应该写在类型之后,而不是变量名之后:Field[] fields = ...;。 -
@Turing85 nope...这是一个私有类请参考日志:2018-12-26 12:38:04,857 INFO [http-nio-8180-exec-4] [] [] [ diy-CJ] []- 字段为:private com.paytm.oe.entity.RelatedBusinessSolutionMapping com.paytm.oe.entity.UserBusinessMapping.relatedBusinessSolutionMapping
-
JVM 不会说谎。如果它告诉你这是对象的类名,那么这是对象的类名。该对象是 javassist 生成的动态代理类的一个实例。
-
它是类名。因为您使用的框架会生成和使用由 javassist 生成的动态代理。
-
如果确定不是类名,为什么Java会告诉你它是类名?您是否在 javadoc 中的某处看到“返回类名,但有时会附加 _$$_jvst3bb_5e 只是为了惹恼您”?它是您的框架(可能是 Hibernate)生成的动态代理的类名。仅仅因为您不了解代理是什么以及为什么使用它们并不会改变这一事实。
标签: java reflection