for (Class<?> intf : interfaces) {
int flags = intf.getModifiers;
if (!Modifier.isPublic(flags)) {
accessFlags = Modifier.FINAL;
String name = intf.getName;
int n = name.lastIndexOf('.');
String pkg = ((n == -1) ? "" : name.substring(0, n + 1));
if (proxyPkg == ) {
proxyPkg = pkg;
} else if (!pkg.equals(proxyPkg)) {
throw new IllegalArgumentException(
"non-public interfaces from different packages");
}
}
}
检验通过后,会 getMethods(…) 获取接口内的全部方法 。
随后会对 methords 进行一个排序 。具体的代码我就不贴了,排序规则是:如果方法相等(返回值和方法签名一样)或同是一个接口内方法,则当前顺序不变,如果两个方法所在的接口存在继承关系,则父类在前,子类在后 。
之后 validateReturnTypes(…) 判断 methords 是否存在方法签名相同并且返回值类型也相同的methord,如果有则抛出异常 。
接着通过
deduplicateAndGetExceptions(…) 方法,将 methords方法内的相同方法的父类方法剔除掉,并将 methord 保存在数组中 。
转成一维数组和二维数组,Method methodsArray,Class< ? > exceptionsArray,随后给当前代理类命名:包名 + “$Proxy” + num 。
最后调用系统提供的 native 方法 generateProxy(…)。这是真正的代理类创建方法 。感兴趣的可以查看下
java_lang_reflect_Proxy.cc源码和 class_linker.cc源码:
List<Method> methods = getMethods(interfaces);
Collections.sort(methods, ORDER_BY_SIGNATURE_AND_SUBTYPE);
validateReturnTypes(methods);
List<Class<?>> exceptions = deduplicateAndGetExceptions(methods);
Method methodsArray = methods.toArray(new Method[methods.size()]);
Class<?> exceptionsArray = exceptions.toArray(new Class<?>[exceptions.size()]);
/*
* Choose a name for the proxy class to generate.
*/
long num = nextUniqueNumber.getAndIncrement;
String proxyName = proxyPkg + proxyClassNamePrefix + num;
return generateProxy(proxyName, interfaces, loader, methodsArray,
exceptionsArray);
参考:Head First 设计模式:中国电力出版社
版权声明:本文为CSDN博主「mjzuo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明 。
原文链接:
https://blog.csdn.net/mingjiezuo/article/details/105930334
推荐阅读
- 带你读懂古树茶,书剑说普洱书剑古茶冰岛地界阳光大晒场
- 带你了解雨前茶,雨前茶是什么时候
- 太极运动的奥秘 带你了解太极运动
- 带你探索纯料之谜,深度探索台北茶文化
- 喝粤式早茶,手敲桌面3下啥意思?弄懂6大规矩,服务员:这是老广
- 一分钟带你读懂五线谱
- 学习python你必须弄懂的 Python、Pycharm、Anaconda 三者的关系
- 都是酱油,生抽、味极鲜、一品鲜区别挺大,弄懂了再买不吃亏
- 怎样选择数据库?一文看懂数据库分类
- 陈年老茶和新茶的区别,弄懂普洱茶生茶和熟茶的区别