📄 usagemarker.java
字号:
markCpEntry(classFile, classCpInfo.u2nameIndex); // Mark the referenced class itself. classCpInfo.referencedClassAccept(this); } } public void visitNameAndTypeCpInfo(ClassFile classFile, NameAndTypeCpInfo nameAndTypeCpInfo) { if (!isUsed(nameAndTypeCpInfo)) { markAsUsed(nameAndTypeCpInfo); markCpEntry(classFile, nameAndTypeCpInfo.u2nameIndex); markCpEntry(classFile, nameAndTypeCpInfo.u2descriptorIndex); // Mark the classes referenced in the descriptor string. nameAndTypeCpInfo.referencedClassesAccept(this); } } // Implementations for AttrInfoVisitor. // Note that attributes are typically only referenced once, so we don't // test if they have been marked already. public void visitUnknownAttrInfo(ClassFile classFile, UnknownAttrInfo unknownAttrInfo) { // This is the best we can do for unknown attributes. markAsUsed(unknownAttrInfo); markCpEntry(classFile, unknownAttrInfo.u2attrNameIndex); } public void visitInnerClassesAttrInfo(ClassFile classFile, InnerClassesAttrInfo innerClassesAttrInfo) { // Don't mark the attribute and its name yet. We may mark it later, in // InnerUsageMarker. //markAsUsed(innerClassesAttrInfo); //markCpEntry(classFile, innerClassesAttrInfo.u2attrNameIndex); innerClassesAttrInfo.innerClassEntriesAccept(classFile, this); } public void visitEnclosingMethodAttrInfo(ClassFile classFile, EnclosingMethodAttrInfo enclosingMethodAttrInfo) { markAsUsed(enclosingMethodAttrInfo); markCpEntry(classFile, enclosingMethodAttrInfo.u2attrNameIndex); markCpEntry(classFile, enclosingMethodAttrInfo.u2classIndex); if (enclosingMethodAttrInfo.u2nameAndTypeIndex != 0) { markCpEntry(classFile, enclosingMethodAttrInfo.u2nameAndTypeIndex); } } public void visitConstantValueAttrInfo(ClassFile classFile, FieldInfo fieldInfo, ConstantValueAttrInfo constantValueAttrInfo) { markAsUsed(constantValueAttrInfo); markCpEntry(classFile, constantValueAttrInfo.u2attrNameIndex); markCpEntry(classFile, constantValueAttrInfo.u2constantValueIndex); } public void visitExceptionsAttrInfo(ClassFile classFile, MethodInfo methodInfo, ExceptionsAttrInfo exceptionsAttrInfo) { markAsUsed(exceptionsAttrInfo); markCpEntry(classFile, exceptionsAttrInfo.u2attrNameIndex); // Mark the constant pool entries referenced by the exceptions. exceptionsAttrInfo.exceptionEntriesAccept((ProgramClassFile)classFile, this); } public void visitCodeAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo) { markAsUsed(codeAttrInfo); markCpEntry(classFile, codeAttrInfo.u2attrNameIndex); // Mark the constant pool entries referenced by the instructions, // and the exceptions and attributes. codeAttrInfo.instructionsAccept(classFile, methodInfo, this); codeAttrInfo.exceptionsAccept(classFile, methodInfo, this); codeAttrInfo.attributesAccept(classFile, methodInfo, this); } public void visitLineNumberTableAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, LineNumberTableAttrInfo lineNumberTableAttrInfo) { markAsUsed(lineNumberTableAttrInfo); markCpEntry(classFile, lineNumberTableAttrInfo.u2attrNameIndex); } public void visitLocalVariableTableAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, LocalVariableTableAttrInfo localVariableTableAttrInfo) { markAsUsed(localVariableTableAttrInfo); markCpEntry(classFile, localVariableTableAttrInfo.u2attrNameIndex); // Mark the constant pool entries referenced by the local variables. localVariableTableAttrInfo.localVariablesAccept(classFile, methodInfo, codeAttrInfo, this); } public void visitLocalVariableTypeTableAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, LocalVariableTypeTableAttrInfo localVariableTypeTableAttrInfo) { markAsUsed(localVariableTypeTableAttrInfo); markCpEntry(classFile, localVariableTypeTableAttrInfo.u2attrNameIndex); // Mark the constant pool entries referenced by the local variable types. localVariableTypeTableAttrInfo.localVariablesAccept(classFile, methodInfo, codeAttrInfo, this); } public void visitSourceFileAttrInfo(ClassFile classFile, SourceFileAttrInfo sourceFileAttrInfo) { markAsUsed(sourceFileAttrInfo); markCpEntry(classFile, sourceFileAttrInfo.u2attrNameIndex); markCpEntry(classFile, sourceFileAttrInfo.u2sourceFileIndex); } public void visitSourceDirAttrInfo(ClassFile classFile, SourceDirAttrInfo sourceDirAttrInfo) { markAsUsed(sourceDirAttrInfo); markCpEntry(classFile, sourceDirAttrInfo.u2attrNameIndex); markCpEntry(classFile, sourceDirAttrInfo.u2sourceDirIndex); } public void visitDeprecatedAttrInfo(ClassFile classFile, DeprecatedAttrInfo deprecatedAttrInfo) { markAsUsed(deprecatedAttrInfo); markCpEntry(classFile, deprecatedAttrInfo.u2attrNameIndex); } public void visitSyntheticAttrInfo(ClassFile classFile, SyntheticAttrInfo syntheticAttrInfo) { markAsUsed(syntheticAttrInfo); markCpEntry(classFile, syntheticAttrInfo.u2attrNameIndex); } public void visitSignatureAttrInfo(ClassFile classFile, SignatureAttrInfo signatureAttrInfo) { markAsUsed(signatureAttrInfo); markCpEntry(classFile, signatureAttrInfo.u2attrNameIndex); markCpEntry(classFile, signatureAttrInfo.u2signatureIndex); } public void visitRuntimeVisibleAnnotationAttrInfo(ClassFile classFile, RuntimeVisibleAnnotationsAttrInfo runtimeVisibleAnnotationsAttrInfo) { markAsUsed(runtimeVisibleAnnotationsAttrInfo); markCpEntry(classFile, runtimeVisibleAnnotationsAttrInfo.u2attrNameIndex); // Mark the constant pool entries referenced by the annotations. runtimeVisibleAnnotationsAttrInfo.annotationsAccept(classFile, this); } public void visitRuntimeInvisibleAnnotationAttrInfo(ClassFile classFile, RuntimeInvisibleAnnotationsAttrInfo runtimeInvisibleAnnotationsAttrInfo) { markAsUsed(runtimeInvisibleAnnotationsAttrInfo); markCpEntry(classFile, runtimeInvisibleAnnotationsAttrInfo.u2attrNameIndex); // Mark the constant pool entries referenced by the annotations. runtimeInvisibleAnnotationsAttrInfo.annotationsAccept(classFile, this); } public void visitRuntimeVisibleParameterAnnotationAttrInfo(ClassFile classFile, RuntimeVisibleParameterAnnotationsAttrInfo runtimeVisibleParameterAnnotationsAttrInfo) { markAsUsed(runtimeVisibleParameterAnnotationsAttrInfo); markCpEntry(classFile, runtimeVisibleParameterAnnotationsAttrInfo.u2attrNameIndex); // Mark the constant pool entries referenced by the annotations. runtimeVisibleParameterAnnotationsAttrInfo.annotationsAccept(classFile, this); } public void visitRuntimeInvisibleParameterAnnotationAttrInfo(ClassFile classFile, RuntimeInvisibleParameterAnnotationsAttrInfo runtimeInvisibleParameterAnnotationsAttrInfo) { markAsUsed(runtimeInvisibleParameterAnnotationsAttrInfo); markCpEntry(classFile, runtimeInvisibleParameterAnnotationsAttrInfo.u2attrNameIndex); // Mark the constant pool entries referenced by the annotations. runtimeInvisibleParameterAnnotationsAttrInfo.annotationsAccept(classFile, this); } public void visitAnnotationDefaultAttrInfo(ClassFile classFile, AnnotationDefaultAttrInfo annotationDefaultAttrInfo) { markAsUsed(annotationDefaultAttrInfo); markCpEntry(classFile, annotationDefaultAttrInfo.u2attrNameIndex); // Mark the constant pool entries referenced by the element value. annotationDefaultAttrInfo.defaultValueAccept(classFile, this); } // Implementations for ExceptionInfoVisitor. public void visitExceptionInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, ExceptionInfo exceptionInfo) { markAsUsed(exceptionInfo); if (exceptionInfo.u2catchType != 0) { markCpEntry(classFile, exceptionInfo.u2catchType); } } // Implementations for InnerClassesInfoVisitor. public void visitInnerClassesInfo(ClassFile classFile, InnerClassesInfo innerClassesInfo) { // At this point, we only mark outer classes of this class. // Inner class can be marked later, by InnerUsageMarker. if (innerClassesInfo.u2innerClassInfoIndex == 0 && classFile.getName().equals(classFile.getCpClassNameString(innerClassesInfo.u2innerClassInfoIndex))) { markAsUsed(innerClassesInfo); if (innerClassesInfo.u2innerClassInfoIndex != 0) { markCpEntry(classFile, innerClassesInfo.u2innerClassInfoIndex); } if (innerClassesInfo.u2outerClassInfoIndex != 0) { markCpEntry(classFile, innerClassesInfo.u2outerClassInfoIndex); } if (innerClassesInfo.u2innerNameIndex != 0) { markCpEntry(classFile, innerClassesInfo.u2innerNameIndex); } } } // Implementations for LocalVariableInfoVisitor. public void visitLocalVariableInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, LocalVariableInfo localVariableInfo) { markCpEntry(classFile, localVariableInfo.u2nameIndex); markCpEntry(classFile, localVariableInfo.u2descriptorIndex); } // Implementations for LocalVariableTypeInfoVisitor. public void visitLocalVariableTypeInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, LocalVariableTypeInfo localVariableTypeInfo) { markCpEntry(classFile, localVariableTypeInfo.u2nameIndex); markCpEntry(classFile, localVariableTypeInfo.u2signatureIndex); } // Implementations for AnnotationVisitor. public void visitAnnotation(ClassFile classFile, Annotation annotation) { markCpEntry(classFile, annotation.u2typeIndex); // Mark the constant pool entries referenced by the element values. annotation.elementValuesAccept(classFile, this); } // Implementations for ElementValueVisitor. public void visitConstantElementValue(ClassFile classFile, Annotation annotation, ConstantElementValue constantElementValue) { if (constantElementValue.u2elementName != 0) { markCpEntry(classFile, constantElementValue.u2elementName); } markCpEntry(classFile, constantElementValue.u2constantValueIndex); } public void visitEnumConstantElementValue(ClassFile classFile, Annotation annotation, EnumConstantElementValue enumConstantElementValue) { if (enumConstantElementValue.u2elementName != 0) { markCpEntry(classFile, enumConstantElementValue.u2elementName); } markCpEntry(classFile, enumConstantElementValue.u2typeNameIndex); markCpEntry(classFile, enumConstantElementValue.u2constantNameIndex); } public void visitClassElementValue(ClassFile classFile, Annotation annotation, ClassElementValue classElementValue) { if (classElementValue.u2elementName != 0) { markCpEntry(classFile, classElementValue.u2elementName); } // Mark the referenced class constant pool entry. markCpEntry(classFile, classElementValue.u2classInfoIndex); } public void visitAnnotationElementValue(ClassFile classFile, Annotation annotation, AnnotationElementValue annotationElementValue) { if (annotationElementValue.u2elementName != 0) { markCpEntry(classFile, annotationElementValue.u2elementName); } // Mark the constant pool entries referenced by the annotation. annotationElementValue.annotationAccept(classFile, this); } public void visitArrayElementValue(ClassFile classFile, Annotation annotation, ArrayElementValue arrayElementValue) { if (arrayElementValue.u2elementName != 0) { markCpEntry(classFile, arrayElementValue.u2elementName); } // Mark the constant pool entries referenced by the element values. arrayElementValue.elementValuesAccept(classFile, annotation, this); } // Implementations for InstructionVisitor. public void visitSimpleInstruction(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, int offset, SimpleInstruction simpleInstruction) {} public void visitVariableInstruction(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, int offset, VariableInstruction variableInstruction) {} public void visitBranchInstruction(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, int offset, BranchInstruction branchInstruction) {} public void visitTableSwitchInstruction(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, int offset, TableSwitchInstruction tableSwitchInstruction) {} public void visitLookUpSwitchInstruction(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, int offset, LookUpSwitchInstruction lookUpSwitchInstruction) {} public void visitCpInstruction(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo, int offset, CpInstruction cpInstruction) { markCpEntry(classFile, cpInstruction.cpIndex); } // Small utility methods. /** * Marks the given constant pool entry of the given class. This includes * visiting any referenced objects. */ private void markCpEntry(ClassFile classFile, int index) { classFile.constantPoolEntryAccept(index, this); } static void markAsUnused(VisitorAccepter visitorAccepter) { visitorAccepter.setVisitorInfo(null); } static void markAsPossiblyUsed(VisitorAccepter visitorAccepter) { visitorAccepter.setVisitorInfo(POSSIBLY_USED); } static boolean isPossiblyUsed(VisitorAccepter visitorAccepter) { return visitorAccepter.getVisitorInfo() == POSSIBLY_USED; } static void markAsUsed(VisitorAccepter visitorAccepter) { visitorAccepter.setVisitorInfo(USED); } static boolean isUsed(VisitorAccepter visitorAccepter) { return visitorAccepter.getVisitorInfo() == USED; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -