背景
NamingPolicy表示生成类的名字的策略,比如、
上一节看到了生成的class文件名字是KeySample$MyFactory$$KeyFactoryByCGLIB$$7116a61e,这个是由NamingPolicy定的
结论
默认的实现类:DefaultNamingPolicy, 具体cglib动态生成类的命名控制
一般的命名规则:
被代理class name + "$$" + 使用cglib处理的class name + "ByCGLIB" + "$$" + key的hashcode
示例:FastSource$$FastClassByCGLIB$$e1a36bab.class
源码
生成类的时候都会涉及AbstractClassGenerator#generateClass
都会生成类名,比如net.sf.cglib.core.KeyFactory.Generator#generateClass
ce.begin_class(Constants.V1_2,
Constants.ACC_PUBLIC,
getClassName(),
KEY_FACTORY,
new Type[]{ Type.getType(keyInterface) },
Constants.SOURCE_FILE);
AbstractClassGenerator#getClassName()是获取类名
final protected String getClassName() {
if (className == null)
className = getClassName(getClassLoader());
return className;
}
private String getClassName(final ClassLoader loader) {
final Set nameCache = getClassNameCache(loader);
return namingPolicy.getClassName(namePrefix, source.name, key, new Predicate() {
public boolean evaluate(Object arg) {
return nameCache.contains(arg);
}
});
}
NamingPolicy接口很简单
public interface NamingPolicy {
String getClassName(String prefix, String source, Object key, Predicate names);
boolean equals(Object o);
}
默认的实现
net.sf.cglib.core.DefaultNamingPolicy#getClassName
public String getClassName(String prefix, String source, Object key, Predicate names) {
if (prefix == null) {
prefix = "net.sf.cglib.empty.Object";
} else if (prefix.startsWith("java")) {
prefix = "$" + prefix;
}
String base =
prefix + "$$" +
source.substring(source.lastIndexOf('.') + 1) +
getTag() + "$$" +
Integer.toHexString(key.hashCode());
String attempt = base;
int index = 2;
while (names.evaluate(attempt))
attempt = base + "_" + index++;
return attempt;
}
其中prefix一般就是类名,比如samples.KeySample$MyFactory
source.substring(source.lastIndexOf('.') + 1) 就是source的按.最后一部分,如net.sf.cglib.core.KeyFactory截取KeyFactory
最后就是hashCode
思考
记住结论就行
被代理class name + "$$" + 使用cglib处理的class name + "ByCGLIB" + "$$" + key的hashcode
refer
http://cglib.sourceforge.net/apidocs/
http://www.cnblogs.com/cruze/p/3847968.html
转摘:https://www.jianshu.com/p/dbaf90db1f8f