📄 usagemarker.java
字号:
markConstant(clazz, sourceFileAttribute.u2attributeNameIndex); markConstant(clazz, sourceFileAttribute.u2sourceFileIndex); } public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) { markAsUsed(sourceDirAttribute); markConstant(clazz, sourceDirAttribute.u2attributeNameIndex); markConstant(clazz, sourceDirAttribute.u2sourceDirIndex); } public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) { // Don't mark the attribute and its name yet. We may mark it later, in // InnerUsageMarker. //markAsUsed(innerClassesAttribute); //markConstant(clazz, innerClassesAttribute.u2attrNameIndex); // Do mark the outer class entries. innerClassesAttribute.innerClassEntriesAccept(clazz, this); } public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) { markAsUsed(enclosingMethodAttribute); markConstant(clazz, enclosingMethodAttribute.u2attributeNameIndex); markConstant(clazz, enclosingMethodAttribute.u2classIndex); if (enclosingMethodAttribute.u2nameAndTypeIndex != 0) { markConstant(clazz, enclosingMethodAttribute.u2nameAndTypeIndex); } } public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) { markAsUsed(deprecatedAttribute); markConstant(clazz, deprecatedAttribute.u2attributeNameIndex); } public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) { markAsUsed(syntheticAttribute); markConstant(clazz, syntheticAttribute.u2attributeNameIndex); } public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) { markAsUsed(signatureAttribute); markConstant(clazz, signatureAttribute.u2attributeNameIndex); markConstant(clazz, signatureAttribute.u2signatureIndex); } public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) { markAsUsed(constantValueAttribute); markConstant(clazz, constantValueAttribute.u2attributeNameIndex); markConstant(clazz, constantValueAttribute.u2constantValueIndex); } public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) { markAsUsed(exceptionsAttribute); markConstant(clazz, exceptionsAttribute.u2attributeNameIndex); // Mark the constant pool entries referenced by the exceptions. exceptionsAttribute.exceptionEntriesAccept((ProgramClass)clazz, this); } public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) { markAsUsed(codeAttribute); markConstant(clazz, codeAttribute.u2attributeNameIndex); // Mark the constant pool entries referenced by the instructions, // by the exceptions, and by the attributes. codeAttribute.instructionsAccept(clazz, method, this); codeAttribute.exceptionsAccept(clazz, method, this); codeAttribute.attributesAccept(clazz, method, this); } public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) { markAsUsed(stackMapAttribute); markConstant(clazz, stackMapAttribute.u2attributeNameIndex); // Mark the constant pool entries referenced by the stack map frames. stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); } public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) { markAsUsed(stackMapTableAttribute); markConstant(clazz, stackMapTableAttribute.u2attributeNameIndex); // Mark the constant pool entries referenced by the stack map frames. stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this); } public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) { markAsUsed(lineNumberTableAttribute); markConstant(clazz, lineNumberTableAttribute.u2attributeNameIndex); } public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) { markAsUsed(localVariableTableAttribute); markConstant(clazz, localVariableTableAttribute.u2attributeNameIndex); // Mark the constant pool entries referenced by the local variables. localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); } public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) { markAsUsed(localVariableTypeTableAttribute); markConstant(clazz, localVariableTypeTableAttribute.u2attributeNameIndex); // Mark the constant pool entries referenced by the local variable types. localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this); } public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) { // Don't mark the attribute and its contents yet. We may mark them later, // in AnnotationUsageMarker.// markAsUsed(annotationsAttribute);//// markConstant(clazz, annotationsAttribute.u2attributeNameIndex);//// // Mark the constant pool entries referenced by the annotations.// annotationsAttribute.annotationsAccept(clazz, this); } public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) { // Don't mark the attribute and its contents yet. We may mark them later, // in AnnotationUsageMarker.// markAsUsed(parameterAnnotationsAttribute);//// markConstant(clazz, parameterAnnotationsAttribute.u2attributeNameIndex);//// // Mark the constant pool entries referenced by the annotations.// parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); } public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) { // Don't mark the attribute and its contents yet. We may mark them later, // in AnnotationUsageMarker.// markAsUsed(annotationDefaultAttribute);//// markConstant(clazz, annotationDefaultAttribute.u2attributeNameIndex);//// // Mark the constant pool entries referenced by the element value.// annotationDefaultAttribute.defaultValueAccept(clazz, this); } // Implementations for ExceptionInfoVisitor. public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) { markAsUsed(exceptionInfo); if (exceptionInfo.u2catchType != 0) { markConstant(clazz, exceptionInfo.u2catchType); } } // Implementations for InnerClassesInfoVisitor. public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo) { // At this point, we only mark outer classes of this class. // Inner class can be marked later, by InnerUsageMarker. if (innerClassesInfo.u2innerClassIndex == 0 && clazz.getName().equals(clazz.getClassName(innerClassesInfo.u2innerClassIndex))) { markAsUsed(innerClassesInfo); if (innerClassesInfo.u2innerClassIndex != 0) { markConstant(clazz, innerClassesInfo.u2innerClassIndex); } if (innerClassesInfo.u2outerClassIndex != 0) { markConstant(clazz, innerClassesInfo.u2outerClassIndex); } if (innerClassesInfo.u2innerNameIndex != 0) { markConstant(clazz, innerClassesInfo.u2innerNameIndex); } } } // Implementations for StackMapFrameVisitor. public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame) {} public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame) { // Mark the constant pool entries referenced by the verification types. sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this); } public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame) { // Mark the constant pool entries referenced by the verification types. moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this); } public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame) { // Mark the constant pool entries referenced by the verification types. fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this); fullFrame.stackAccept(clazz, method, codeAttribute, offset, this); } // Implementations for VerificationTypeVisitor. public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) {} public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType) { markConstant(clazz, objectType.u2classIndex); } // Implementations for LocalVariableInfoVisitor. public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo) { markConstant(clazz, localVariableInfo.u2nameIndex); markConstant(clazz, localVariableInfo.u2descriptorIndex); } // Implementations for LocalVariableTypeInfoVisitor. public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo) { markConstant(clazz, localVariableTypeInfo.u2nameIndex); markConstant(clazz, localVariableTypeInfo.u2signatureIndex); } // Implementations for AnnotationVisitor. public void visitAnnotation(Clazz clazz, Annotation annotation) { markConstant(clazz, annotation.u2typeIndex); // Mark the constant pool entries referenced by the element values. annotation.elementValuesAccept(clazz, this); } // Implementations for ElementValueVisitor. public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) { if (constantElementValue.u2elementNameIndex != 0) { markConstant(clazz, constantElementValue.u2elementNameIndex); } markConstant(clazz, constantElementValue.u2constantValueIndex); } public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) { if (enumConstantElementValue.u2elementNameIndex != 0) { markConstant(clazz, enumConstantElementValue.u2elementNameIndex); } markConstant(clazz, enumConstantElementValue.u2typeNameIndex); markConstant(clazz, enumConstantElementValue.u2constantNameIndex); } public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) { if (classElementValue.u2elementNameIndex != 0) { markConstant(clazz, classElementValue.u2elementNameIndex); } // Mark the referenced class constant pool entry. markConstant(clazz, classElementValue.u2classInfoIndex); } public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) { if (annotationElementValue.u2elementNameIndex != 0) { markConstant(clazz, annotationElementValue.u2elementNameIndex); } // Mark the constant pool entries referenced by the annotation. annotationElementValue.annotationAccept(clazz, this); } public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) { if (arrayElementValue.u2elementNameIndex != 0) { markConstant(clazz, arrayElementValue.u2elementNameIndex); } // Mark the constant pool entries referenced by the element values. arrayElementValue.elementValuesAccept(clazz, annotation, this); } // Implementations for InstructionVisitor. public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {} public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction) { markConstant(clazz, constantInstruction.constantIndex); } // Small utility methods. /** * Marks the given visitor accepter as being used. */ protected void markAsUsed(VisitorAccepter visitorAccepter) { visitorAccepter.setVisitorInfo(USED); } /** * Returns whether the given visitor accepter should still be marked as * being used. */ protected boolean shouldBeMarkedAsUsed(VisitorAccepter visitorAccepter) { return visitorAccepter.getVisitorInfo() != USED; } /** * Returns whether the given visitor accepter has been marked as being used. */ protected boolean isUsed(VisitorAccepter visitorAccepter) { return visitorAccepter.getVisitorInfo() == USED; } /** * Marks the given visitor accepter as possibly being used. */ protected void markAsPossiblyUsed(VisitorAccepter visitorAccepter) { visitorAccepter.setVisitorInfo(POSSIBLY_USED); } /** * Returns whether the given visitor accepter should still be marked as * possibly being used. */ protected boolean shouldBeMarkedAsPossiblyUsed(VisitorAccepter visitorAccepter) { return visitorAccepter.getVisitorInfo() != USED && visitorAccepter.getVisitorInfo() != POSSIBLY_USED; } /** * Returns whether the given visitor accepter has been marked as possibly * being used. */ protected boolean isPossiblyUsed(VisitorAccepter visitorAccepter) { return visitorAccepter.getVisitorInfo() == POSSIBLY_USED; } /** * Clears any usage marks from the given visitor accepter. */ protected void markAsUnused(VisitorAccepter visitorAccepter) { visitorAccepter.setVisitorInfo(null); } /** * Marks the given constant pool entry of the given class. This includes * visiting any referenced objects. */ private void markConstant(Clazz clazz, int index) { clazz.constantPoolEntryAccept(index, this); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -