【问题标题】:How to know original class name if wrapped into proxy by Spring?如果被 Spring 包装到代理中,如何知道原始类名?
【发布时间】:2015-06-06 08:38:58
【问题描述】:

我正在尝试通过getClass().getSimpleName()Spring 下获取一些类名,它返回类似

MyClass$$EnhancerBySpringCGLIB$$SOMEHEX

这可能是因为Spring 将类包装到代理中。

有没有可移植的方式来获取原始类名?

【问题讨论】:

  • 你为什么要这样做?
  • 有什么理由不应该这样做吗?

标签: java spring proxy-classes cglib


【解决方案1】:

Spring为此提供了一个实用程序。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/ClassUtils.html#getUserClass-java.lang.Class-

public static Class<?> getUserClass(Class<?> clazz)

“返回给定类的用户定义类:通常只是给定类,但如果是 CGLIB 生成的子类,则返回原始类。”

【讨论】:

  • 我忘了说:这只适用于 spring 代理的对象。没有用于检测任何给定代理的目标类型的通用解决方案。我解决这个问题的方法是明确定义代理本身外部的代理的目标类型。
  • 谢谢!这很有效,而其他建议(例如 TargetAwareClass)因类转换异常而失败。
  • 在 spring boot 中:log.debug(ClassUtils.getUserClass(constraintDescriptor.getAnnotation()).getName());com.sun.proxy.$Proxy153 :-/
  • Spring使用JDK动态代理机制而不是cglib创建代理类时是如何工作的?
  • @e-info128 : 你找到解决办法了吗?
猜你喜欢
  • 2014-12-29
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2015-04-14
  • 2021-09-11
  • 2011-04-28
相关资源
最近更新 更多