📄 memberreferencefixer.java
字号:
{ if (DEBUG) { System.out.println("MemberReferenceFixer:"); System.out.println(" Class file = "+classFile.getName()); System.out.println(" Ref class file = "+referencedClassFile.getName()); System.out.println(" Ref method = "+methodrefCpInfo.getName(classFile)+methodrefCpInfo.getType(classFile)); System.out.println(" -> interface method"); } // Replace the method reference by an interface method reference. ((ProgramClassFile)classFile).constantPool[this.cpIndex] = new InterfaceMethodrefCpInfo(methodrefCpInfo.u2classIndex, methodrefCpInfo.u2nameAndTypeIndex, referencedClassFile, referencedMemberInfo); } } } public void visitClassCpInfo(ClassFile classFile, ClassCpInfo classCpInfo) { // Check if this class entry refers to an interface class. ClassFile referencedClassFile = classCpInfo.referencedClassFile; if (referencedClassFile != null) { isInterfaceMethod = (referencedClassFile.getAccessFlags() & ClassConstants.INTERNAL_ACC_INTERFACE) != 0; } } // Implementations for MemberInfoVisitor. public void visitProgramFieldInfo(ProgramClassFile programClassFile, ProgramFieldInfo programFieldInfo) { // Fix the attributes. programFieldInfo.attributesAccept(programClassFile, this); } public void visitProgramMethodInfo(ProgramClassFile programClassFile, ProgramMethodInfo programMethodInfo) { // Fix the attributes. programMethodInfo.attributesAccept(programClassFile, this); } public void visitLibraryFieldInfo(LibraryClassFile libraryClassFile, LibraryFieldInfo libraryFieldInfo) {} public void visitLibraryMethodInfo(LibraryClassFile libraryClassFile, LibraryMethodInfo libraryMethodInfo) {} // Implementations for AttrInfoVisitor. public void visitUnknownAttrInfo(ClassFile classFile, UnknownAttrInfo unknownAttrInfo) {} public void visitInnerClassesAttrInfo(ClassFile classFile, InnerClassesAttrInfo innerClassesAttrInfo) {} public void visitConstantValueAttrInfo(ClassFile classFile, FieldInfo fieldInfo, ConstantValueAttrInfo constantValueAttrInfo) {} public void visitExceptionsAttrInfo(ClassFile classFile, MethodInfo methodInfo, ExceptionsAttrInfo exceptionsAttrInfo) {} public void visitLineNumberTableAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, LineNumberTableAttrInfo lineNumberTableAttrInfo) {} public void visitLocalVariableTableAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, LocalVariableTableAttrInfo localVariableTableAttrInfo) {} public void visitLocalVariableTypeTableAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, LocalVariableTypeTableAttrInfo localVariableTypeTableAttrInfo) {} public void visitSourceFileAttrInfo(ClassFile classFile, SourceFileAttrInfo sourceFileAttrInfo) {} public void visitSourceDirAttrInfo(ClassFile classFile, SourceDirAttrInfo sourceDirAttrInfo) {} public void visitDeprecatedAttrInfo(ClassFile classFile, DeprecatedAttrInfo deprecatedAttrInfo) {} public void visitSyntheticAttrInfo(ClassFile classFile, SyntheticAttrInfo syntheticAttrInfo) {} public void visitSignatureAttrInfo(ClassFile classFile, SignatureAttrInfo signatureAttrInfo) {} public void visitEnclosingMethodAttrInfo(ClassFile classFile, EnclosingMethodAttrInfo enclosingMethodAttrInfo) { MemberInfo referencedMemberInfo = enclosingMethodAttrInfo.referencedMethodInfo; if (referencedMemberInfo != null) { ClassFile referencedClassFile = enclosingMethodAttrInfo.referencedClassFile; // Does it have a new class? if (!enclosingMethodAttrInfo.getClassName(classFile).equals(referencedClassFile.getName())) { // Update the class index. enclosingMethodAttrInfo.u2classIndex = constantPoolEditor.addClassCpInfo((ProgramClassFile)classFile, referencedClassFile); } // Does it have a new name or type? if (!enclosingMethodAttrInfo.getName(classFile).equals(referencedMemberInfo.getName(referencedClassFile)) || !enclosingMethodAttrInfo.getType(classFile).equals(referencedMemberInfo.getDescriptor(referencedClassFile))) { // Update the name and type index. enclosingMethodAttrInfo.u2nameAndTypeIndex = constantPoolEditor.addNameAndTypeCpInfo((ProgramClassFile)classFile, referencedMemberInfo.getName(referencedClassFile), referencedMemberInfo.getDescriptor(referencedClassFile)); } } } public void visitCodeAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo) { // Recompute the maximum stack size if necessary. if (stackSizesMayHaveChanged) { stackSizeUpdater.visitCodeAttrInfo(classFile, methodInfo, codeAttrInfo); } // Fix the nested attributes. codeAttrInfo.attributesAccept(classFile, methodInfo, this); } public void visitRuntimeVisibleAnnotationAttrInfo(ClassFile classFile, RuntimeVisibleAnnotationsAttrInfo runtimeVisibleAnnotationsAttrInfo) { // Fix the annotations. runtimeVisibleAnnotationsAttrInfo.annotationsAccept(classFile, this); } public void visitRuntimeInvisibleAnnotationAttrInfo(ClassFile classFile, RuntimeInvisibleAnnotationsAttrInfo runtimeInvisibleAnnotationsAttrInfo) { // Fix the annotations. runtimeInvisibleAnnotationsAttrInfo.annotationsAccept(classFile, this); } public void visitRuntimeVisibleParameterAnnotationAttrInfo(ClassFile classFile, RuntimeVisibleParameterAnnotationsAttrInfo runtimeVisibleParameterAnnotationsAttrInfo) { // Fix the annotations. runtimeVisibleParameterAnnotationsAttrInfo.annotationsAccept(classFile, this); } public void visitRuntimeInvisibleParameterAnnotationAttrInfo(ClassFile classFile, RuntimeInvisibleParameterAnnotationsAttrInfo runtimeInvisibleParameterAnnotationsAttrInfo) { // Fix the annotations. runtimeInvisibleParameterAnnotationsAttrInfo.annotationsAccept(classFile, this); } public void visitAnnotationDefaultAttrInfo(ClassFile classFile, AnnotationDefaultAttrInfo annotationDefaultAttrInfo) { // Fix the annotation. annotationDefaultAttrInfo.defaultValueAccept(classFile, this); } // Implementations for AnnotationVisitor. public void visitAnnotation(ClassFile classFile, Annotation annotation) { // Fix the element values. annotation.elementValuesAccept(classFile, this); } // Implementations for ElementValueVisitor. public void visitConstantElementValue(ClassFile classFile, Annotation annotation, ConstantElementValue constantElementValue) { fixElementValue(classFile, annotation, constantElementValue); } public void visitEnumConstantElementValue(ClassFile classFile, Annotation annotation, EnumConstantElementValue enumConstantElementValue) { fixElementValue(classFile, annotation, enumConstantElementValue); } public void visitClassElementValue(ClassFile classFile, Annotation annotation, ClassElementValue classElementValue) { fixElementValue(classFile, annotation, classElementValue); } public void visitAnnotationElementValue(ClassFile classFile, Annotation annotation, AnnotationElementValue annotationElementValue) { fixElementValue(classFile, annotation, annotationElementValue); // Fix the annotation. annotationElementValue.annotationAccept(classFile, this); } public void visitArrayElementValue(ClassFile classFile, Annotation annotation, ArrayElementValue arrayElementValue) { fixElementValue(classFile, annotation, arrayElementValue); // Fix the element values. arrayElementValue.elementValuesAccept(classFile, annotation, this); } // Small utility methods. /** * Fixs the method reference of the element value, if any. */ private void fixElementValue(ClassFile classFile, Annotation annotation, ElementValue elementValue) { // Do we know the referenced method? MemberInfo referencedMemberInfo = elementValue.referencedMethodInfo; if (referencedMemberInfo != null) { // Does it have a new name or type? String methodName = elementValue.getMethodName(classFile); String newMethodName = referencedMemberInfo.getName(annotation.referencedClassFiles[0]); if (!methodName.equals(newMethodName)) { // Update the element name index. elementValue.u2elementName = constantPoolEditor.addUtf8CpInfo((ProgramClassFile)classFile, newMethodName); } } } private void debug(ClassFile classFile, RefCpInfo refCpInfo, ClassFile referencedClassFile, MemberInfo referencedMemberInfo) { System.out.println("MemberReferenceFixer:"); System.out.println(" Class file = "+classFile.getName()); System.out.println(" Ref class file = "+referencedClassFile.getName()); System.out.println(" Ref member name = "+refCpInfo.getName(classFile)); System.out.println(" -> "+referencedMemberInfo.getName(referencedClassFile)); System.out.println(" Ref descriptor = "+refCpInfo.getType(classFile)); System.out.println(" -> "+referencedMemberInfo.getDescriptor(referencedClassFile)); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -