📄 gettersetterinliner.java
字号:
// Fix the access. ((ProgramFieldInfo)referencedFieldInfo).u2accessFlags = AccessUtil.replaceAccessFlags(referencedFieldInfo.getAccessFlags(), referencedMethodInfo.getAccessFlags()); } } else { // We can't give the field the access of the getter or setter. // Forget about inlining it after all. getFieldPutFieldOpcode = 0; } } } /** * This MemberInfoVisitor checks whether the visited member is a simple * getter or setter. */ private class MyGetterSetterChecker implements MemberInfoVisitor, AttrInfoVisitor, InstructionVisitor, CpInfoVisitor { // Implementations for MemberInfoVisitor. public void visitProgramFieldInfo(ProgramClassFile programClassFile, ProgramFieldInfo programFieldInfo) {} public void visitProgramMethodInfo(ProgramClassFile programClassFile, ProgramMethodInfo programMethodInfo) { 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 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 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 visitRuntimeVisibleParameterAnnotationAttrInfo(ClassFile classFile, RuntimeVisibleParameterAnnotationsAttrInfo runtimeVisibleParameterAnnotationsAttrInfo) {} public void visitRuntimeInvisibleParameterAnnotationAttrInfo(ClassFile classFile, RuntimeInvisibleParameterAnnotationsAttrInfo runtimeInvisibleParameterAnnotationsAttrInfo) {} public void visitAnnotationDefaultAttrInfo(ClassFile classFile, AnnotationDefaultAttrInfo annotationDefaultAttrInfo) {} public void visitCodeAttrInfo(ClassFile classFile, MethodInfo methodInfo, CodeAttrInfo codeAttrInfo) { byte[] code = codeAttrInfo.code; int offset = 0; Instruction instruction; // TODO: Handle static getters and setters. // Check the first instruction. instruction = InstructionFactory.create(code, offset); if (instruction.opcode != InstructionConstants.OP_ALOAD_0) { return; } offset += instruction.length(offset); // Start remembering if this is a getter or a setter. boolean getter = true; // TODO: Handle array getters and setters. // Check the second instruction. instruction = InstructionFactory.create(code, offset); byte opcode = instruction.opcode; if (opcode == InstructionConstants.OP_ILOAD_1 || opcode == InstructionConstants.OP_LLOAD_1 || opcode == InstructionConstants.OP_FLOAD_1 || opcode == InstructionConstants.OP_DLOAD_1 || opcode == InstructionConstants.OP_ALOAD_1) { // This instruction is loading the argument. Skip it. offset += instruction.length(offset); instruction = InstructionFactory.create(code, offset); opcode = instruction.opcode; // So this is a setter. getter = false; } // Check the next instruction. if (getter ? opcode != InstructionConstants.OP_GETFIELD : opcode != InstructionConstants.OP_PUTFIELD) { return; } // Retrieve the field class, name and type. instruction.accept(classFile, methodInfo, codeAttrInfo, offset, this); // Check the class. // TODO: Handle fields that are in super classes. if (!classFile.equals(referencedClassFile)) { return; } offset += instruction.length(offset); // Remember the instruction opcode. getFieldPutFieldOpcode = opcode; // Check the last instruction. instruction = InstructionFactory.create(code, offset); opcode = instruction.opcode; if (getter ? opcode != InstructionConstants.OP_IRETURN && opcode != InstructionConstants.OP_LRETURN && opcode != InstructionConstants.OP_FRETURN && opcode != InstructionConstants.OP_DRETURN && opcode != InstructionConstants.OP_ARETURN : opcode != InstructionConstants.OP_RETURN) { // This isn't a simple getter or setter. // Forget about inlining it. getFieldPutFieldOpcode = 0; } } // 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) { // Remember the index of the field reference. referencedFieldIndex = cpInstruction.cpIndex; // Retrieve the referenced field and its class file. classFile.constantPoolEntryAccept(cpInstruction.cpIndex, this); } // Implementations for CpInfoVisitor. public void visitIntegerCpInfo(ClassFile classFile, IntegerCpInfo integerCpInfo) {} public void visitLongCpInfo(ClassFile classFile, LongCpInfo longCpInfo) {} public void visitFloatCpInfo(ClassFile classFile, FloatCpInfo floatCpInfo) {} public void visitDoubleCpInfo(ClassFile classFile, DoubleCpInfo doubleCpInfo) {} public void visitStringCpInfo(ClassFile classFile, StringCpInfo stringCpInfo) {} public void visitUtf8CpInfo(ClassFile classFile, Utf8CpInfo utf8CpInfo) {} public void visitMethodrefCpInfo(ClassFile classFile, MethodrefCpInfo methodrefCpInfo) {} public void visitInterfaceMethodrefCpInfo(ClassFile classFile, InterfaceMethodrefCpInfo interfaceMethodrefCpInfo) {} public void visitClassCpInfo(ClassFile classFile, ClassCpInfo classCpInfo) {} public void visitFieldrefCpInfo(ClassFile classFile, FieldrefCpInfo fieldrefCpInfo) { // Remember the class file and the field. referencedClassFile = fieldrefCpInfo.referencedClassFile; referencedFieldInfo = fieldrefCpInfo.referencedMemberInfo; // Retrieve the referenced class files. classFile.constantPoolEntryAccept(fieldrefCpInfo.u2nameAndTypeIndex, this); } public void visitNameAndTypeCpInfo(ClassFile classFile, NameAndTypeCpInfo nameAndTypeCpInfo) { // Remember the referenced class files of the field. typeReferencedClassFiles = nameAndTypeCpInfo.referencedClassFiles; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -