📄 parametershrinker.java
字号:
// Implementations for AttrInfoVisitor. public void visitUnknownAttrInfo(ClassFile classFile, UnknownAttrInfo unknownAttrInfo) {} public void visitInnerClassesAttrInfo(ClassFile classFile, InnerClassesAttrInfo innerClassesAttrInfo) {} public void visitEnclosingMethodAttrInfo(ClassFile classFile, EnclosingMethodAttrInfo enclosingMethodAttrInfo) {} public void visitConstantValueAttrInfo(ClassFile classFile, FieldInfo fieldInfo, ConstantValueAttrInfo constantValueAttrInfo) {} public void visitExceptionsAttrInfo(ClassFile classFile, MethodInfo methodInfo, ExceptionsAttrInfo exceptionsAttrInfo) {} public void visitCodeAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo) {} 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 visitRuntimeVisibleAnnotationAttrInfo(ClassFile classFile, RuntimeVisibleAnnotationsAttrInfo runtimeVisibleAnnotationsAttrInfo) {} public void visitRuntimeInvisibleAnnotationAttrInfo(ClassFile classFile, RuntimeInvisibleAnnotationsAttrInfo runtimeInvisibleAnnotationsAttrInfo) {} public void visitAnnotationDefaultAttrInfo(ClassFile classFile, AnnotationDefaultAttrInfo annotationDefaultAttrInfo) {} public void visitRuntimeVisibleParameterAnnotationAttrInfo(ClassFile classFile, RuntimeVisibleParameterAnnotationsAttrInfo runtimeVisibleParameterAnnotationsAttrInfo) { // Update the parameter annotations. shrinkParameterAnnotations(classFile, runtimeVisibleParameterAnnotationsAttrInfo); } public void visitRuntimeInvisibleParameterAnnotationAttrInfo(ClassFile classFile, RuntimeInvisibleParameterAnnotationsAttrInfo runtimeInvisibleParameterAnnotationsAttrInfo) { // Update the parameter annotations. shrinkParameterAnnotations(classFile, runtimeInvisibleParameterAnnotationsAttrInfo); } // Small utility methods. /** * Shrinks the given parameter annotations. */ private void shrinkParameterAnnotations(ClassFile classFile, RuntimeParameterAnnotationsAttrInfo runtimeParameterAnnotationsAttrInfo) { Annotation[][] annotations = runtimeParameterAnnotationsAttrInfo.parameterAnnotations; // All parameters of non-static methods are shifted by one in the local // variable frame. int parameterIndex = (methodInfo.getAccessFlags() & ClassConstants.INTERNAL_ACC_STATIC) != 0 ? 0 : 1; int annotationIndex = 0; int newAnnotationIndex = 0; // Go over the parameters. String descriptor = methodInfo.getDescriptor(classFile); InternalTypeEnumeration internalTypeEnumeration = new InternalTypeEnumeration(descriptor); while (internalTypeEnumeration.hasMoreTypes()) { String type = internalTypeEnumeration.nextType(); if (VariableUsageMarker.isVariableUsed(methodInfo, parameterIndex)) { annotations[newAnnotationIndex++] = annotations[annotationIndex]; } annotationIndex++; parameterIndex += ClassUtil.isInternalCategory2Type(type) ? 2 : 1; } runtimeParameterAnnotationsAttrInfo.u2numberOfParameters = newAnnotationIndex; // Clear the unused entries. while (newAnnotationIndex < annotationIndex) { annotations[newAnnotationIndex++] = null; } } /** * Returns a shrunk descriptor of the given method. */ public static String shrinkDescriptor(ProgramClassFile classFile, ProgramMethodInfo methodInfo) { // All parameters of non-static methods are shifted by one in the local // variable frame. int parameterIndex = (methodInfo.getAccessFlags() & ClassConstants.INTERNAL_ACC_STATIC) != 0 ? 0 : 1; // Go over the parameters. InternalTypeEnumeration internalTypeEnumeration = new InternalTypeEnumeration(methodInfo.getDescriptor(classFile)); StringBuffer newDescriptorBuffer = new StringBuffer(); newDescriptorBuffer.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_OPEN); while (internalTypeEnumeration.hasMoreTypes()) { String type = internalTypeEnumeration.nextType(); if (VariableUsageMarker.isVariableUsed(methodInfo, parameterIndex)) { newDescriptorBuffer.append(type); } parameterIndex += ClassUtil.isInternalCategory2Type(type) ? 2 : 1; } newDescriptorBuffer.append(ClassConstants.INTERNAL_METHOD_ARGUMENTS_CLOSE); newDescriptorBuffer.append(internalTypeEnumeration.returnType()); return newDescriptorBuffer.toString(); } /** * Shrinks the array of referenced class files of the given method. */ private static void shrinkReferencedClassFiles(ProgramClassFile classFile, ProgramMethodInfo methodInfo) { ClassFile[] referencedClassFiles = methodInfo.referencedClassFiles; if (referencedClassFiles != null) { // All parameters of non-static methods are shifted by one in the local // variable frame. int parameterIndex = (methodInfo.getAccessFlags() & ClassConstants.INTERNAL_ACC_STATIC) != 0 ? 0 : 1; int referencedClassFileIndex = 0; int newReferencedClassFileIndex = 0; // Go over the parameters. String descriptor = methodInfo.getDescriptor(classFile); InternalTypeEnumeration internalTypeEnumeration = new InternalTypeEnumeration(descriptor); while (internalTypeEnumeration.hasMoreTypes()) { String type = internalTypeEnumeration.nextType(); if (ClassUtil.isInternalArrayType(type)) { type = ClassUtil.internalTypeFromArrayType(type); } if (ClassUtil.isInternalClassType(type)) { if (VariableUsageMarker.isVariableUsed(methodInfo, parameterIndex)) { referencedClassFiles[newReferencedClassFileIndex++] = referencedClassFiles[referencedClassFileIndex]; } referencedClassFileIndex++; } parameterIndex += ClassUtil.isInternalCategory2Type(type) ? 2 : 1; } // Also look at the return value. String type = internalTypeEnumeration.returnType(); if (ClassUtil.isInternalArrayType(type)) { type = ClassUtil.internalTypeFromArrayType(type); } if (ClassUtil.isInternalClassType(type)) { referencedClassFiles[newReferencedClassFileIndex++] = referencedClassFiles[referencedClassFileIndex]; referencedClassFileIndex++; } // Clear the unused entries. while (newReferencedClassFileIndex < referencedClassFileIndex) { referencedClassFiles[newReferencedClassFileIndex++] = null; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -