/** * Get FieldDescriptor describing the field accessed by given FieldInstruction. * * @param fins a FieldInstruction * @param cpg ConstantPoolGen for the method containing the FieldInstruction * @return FieldDescriptor describing the field accessed by given FieldInstruction */ public static FieldDescriptor getAccessedFieldDescriptor( FieldInstruction fins, ConstantPoolGen cpg) { String className = fins.getClassName(cpg); String fieldName = fins.getName(cpg); String fieldSig = fins.getSignature(cpg); boolean isStatic = (fins.getOpcode() == Constants.GETSTATIC || fins.getOpcode() == Constants.PUTSTATIC); return DescriptorFactory.instance() .getFieldDescriptor(className, fieldName, fieldSig, isStatic); }
/** * Look up the field referenced by given FieldInstruction, returning it as an {@link XField * XField} object. * * @param fins the FieldInstruction * @param cpg the ConstantPoolGen used by the class containing the instruction * @return an XField object representing the field, or null if no such field could be found */ public static XField findXField(FieldInstruction fins, @NonNull ConstantPoolGen cpg) throws ClassNotFoundException { String className = fins.getClassName(cpg); String fieldName = fins.getFieldName(cpg); String fieldSig = fins.getSignature(cpg); boolean isStatic = (fins.getOpcode() == Constants.GETSTATIC || fins.getOpcode() == Constants.PUTSTATIC); XField xfield = findXField(className, fieldName, fieldSig, isStatic); short opcode = fins.getOpcode(); if (xfield != null && xfield.isResolved() && xfield.isStatic() == (opcode == Constants.GETSTATIC || opcode == Constants.PUTSTATIC)) return xfield; else return null; }
/** Field access. */ public void visitFieldInstruction(FieldInstruction i) { cv.registerFieldAccess(i.getClassName(cp), i.getFieldName(cp)); cv.registerCoupling(i.getFieldType(cp)); }