java 代码
- //MethodLinker.java里面
- // 这个函数实现了MemberVisitor的接口.
- public void visitAnyMember(Clazz clazz, Member member)
- {
- // 取得类成员的名称和描述符
- String name = member.getName(clazz);
- String descriptor = member.getDescriptor(clazz);
- // 特殊情况: 如果是初始化或构造函数,保持原样不变
- // 我们这儿忽略它
- if (name.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) ||
- name.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT))
- {
- return ;
- }
- // 取得链表中最后一个方法
- Member thisLastMember = lastMember(member);
- // 看看是否已经存在一个相当名称和描述符的方法
- String key = name + ' ' + descriptor;
- Member otherMember = (Member)memberMap.get(key);
- if (otherMember == null )
- {
- // 把新的类方法存到map中
- memberMap.put(key, thisLastMember);
- }
- else
- {
- // 从其它方法链表中找到最后一个元素
- Member otherLastMember = lastMember(otherMember);
- // 检查两个链表是否以相同元素为尾结点
- if (!thisLastMember.equals(otherLastMember))
- {
- // 以库成员为尾结点,合并两个链表
- if (otherLastMember instanceof LibraryMember)
- {
- thisLastMember.setVisitorInfo(otherLastMember);
- }
- else
- {
- otherLastMember.setVisitorInfo(thisLastMember);
- }
- }
- }
- }