gpt4 book ai didi

java - 比较类与 CGLib 增强功能

转载 作者:行者123 更新时间:2023-11-30 02:44:52 25 4
gpt4 key购买 nike

我想测试两个值是否具有相同的类:

x.getClass.equals(y.getClass)

但是,如果一个(或两个)值实际上属于由 CGLib Enhancer 构造的类,则此比较应该成功。

显而易见的解决方案是在类名中搜索 $$EnhancerByCGLIB$$...,将其删除,然后比较类名(和类加载器)的其余部分。有更好的选择吗?

最佳答案

cglib 允许用户设置 NamingStrategy,这使得替换 EnhancerByCGLIB 标记不可靠,因为类可以任意命名。

识别 cglib 类的最可靠方法是检查字段 CGLIB$BOUND 是否存在,该字段被硬编码到库中,因此名称无法更改。如果类中存在这样的字段,则需要检查是否:

  1. 已实现任何接口(interface)。如果至少存在一个接口(interface),则增强类可能就是该接口(interface)。 (您可能会发现必须忽略 cglib 的 Factory 接口(interface)。)
  2. 有一个不是 java.lang.Object 的父类(super class)。即使增强了接口(interface),显然也定义了一个父类(super class)。

作为检测算法的近似值,您可以使用:

static Class<?> original(Class<?> type) {
try {
type.getDeclaredField("CGLIB$BOUND");
if (type.getSuperclass() != Object.class) {
return type.getSuperclass();
}
for (Class<?> iFace : type.getInterfaces()) {
if (iFace != Factory.class) {
return iFace;
}
}
return Object.class;
} catch (NoSuchFieldException ignored) {
return type;
}
}

请注意,cglib 允许为还实现多个接口(interface)的类生成代理,其中上述展开将返回父类(super class)。

关于java - 比较类与 CGLib 增强功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40487097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com