Package org.apache.bcel.generic
Class InstructionFactory
- java.lang.Object
-
- org.apache.bcel.generic.InstructionFactory
-
- All Implemented Interfaces:
InstructionConstants
public class InstructionFactory extends java.lang.Object implements InstructionConstants
Instances of this class may be used, e.g., to generate typed versions of instructions. Its main purpose is to be used as the byte code generating backend of a compiler. You can subclass it to add your own create methods.Note: The static createXXX methods return singleton instances from the
InstructionConst
class.- See Also:
Const
,InstructionConst
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
InstructionFactory.MethodObject
-
Nested classes/interfaces inherited from interface org.apache.bcel.generic.InstructionConstants
InstructionConstants.Clinit
-
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.String
APPEND
private static InstructionFactory.MethodObject[]
appendMethodObjects
protected ClassGen
cg
Deprecated.(since 6.0) will be made private; do not access directly, use getter/setterprotected ConstantPoolGen
cp
Deprecated.(since 6.0) will be made private; do not access directly, use getter/setterprivate static java.lang.String
FQCN_STRING_BUFFER
private static java.lang.String[]
shortNames
-
Fields inherited from interface org.apache.bcel.generic.InstructionConstants
AALOAD, AASTORE, ACONST_NULL, ALOAD_0, ALOAD_1, ALOAD_2, ARETURN, ARRAYLENGTH, ASTORE_0, ASTORE_1, ASTORE_2, ATHROW, BALOAD, BASTORE, bla, CALOAD, CASTORE, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DMUL, DNEG, DREM, DRETURN, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FMUL, FNEG, FREM, FRETURN, FSUB, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, ILOAD_0, ILOAD_1, ILOAD_2, IMUL, INEG, INSTRUCTIONS, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE_0, ISTORE_1, ISTORE_2, ISUB, IUSHR, IXOR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDIV, LMUL, LNEG, LOR, LREM, LRETURN, LSHL, LSHR, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, NOP, POP, POP2, RETURN, SALOAD, SASTORE, SWAP, THIS
-
-
Constructor Summary
Constructors Constructor Description InstructionFactory(ClassGen cg)
Initialize with ClassGen objectInstructionFactory(ClassGen cg, ConstantPoolGen cp)
InstructionFactory(ConstantPoolGen cp)
Initialize just with ConstantPoolGen object
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description Instruction
createAppend(Type type)
static ArrayInstruction
createArrayLoad(Type type)
static ArrayInstruction
createArrayStore(Type type)
private static ArithmeticInstruction
createBinaryDoubleOp(char op)
private static ArithmeticInstruction
createBinaryFloatOp(char op)
private static ArithmeticInstruction
createBinaryIntOp(char first, java.lang.String op)
private static ArithmeticInstruction
createBinaryLongOp(char first, java.lang.String op)
Create an invokedynamic instruction.static ArithmeticInstruction
createBinaryOperation(java.lang.String op, Type type)
Create binary operation for simple basic types, such as int and float.static BranchInstruction
createBranchInstruction(short opcode, InstructionHandle target)
Create branch instruction by given opcode, except LOOKUPSWITCH and TABLESWITCH.Instruction
createCast(Type srcType, Type destType)
Create conversion operation for two stack operands, this may be an I2C, instruction, e.g., if the operands are basic types and CHECKCAST if they are reference types.CHECKCAST
createCheckCast(ReferenceType t)
Instruction
createConstant(java.lang.Object value)
Uses PUSH to push a constant value onto the stack.static StackInstruction
createDup(int size)
static StackInstruction
createDup_1(int size)
static StackInstruction
createDup_2(int size)
FieldInstruction
createFieldAccess(java.lang.String className, java.lang.String name, Type type, short kind)
Create a field instruction.GETFIELD
createGetField(java.lang.String className, java.lang.String name, Type t)
GETSTATIC
createGetStatic(java.lang.String className, java.lang.String name, Type t)
INSTANCEOF
createInstanceOf(ReferenceType t)
InvokeInstruction
createInvoke(java.lang.String className, java.lang.String name, Type retType, Type[] argTypes, short kind)
Create an invoke instruction.InvokeInstruction
createInvoke(java.lang.String className, java.lang.String name, Type retType, Type[] argTypes, short kind, boolean useInterface)
Create an invoke instruction.private InvokeInstruction
createInvoke(InstructionFactory.MethodObject m, short kind)
static LocalVariableInstruction
createLoad(Type type, int index)
NEW
createNew(java.lang.String s)
NEW
createNew(ObjectType t)
Instruction
createNewArray(Type t, short dim)
Create new array of given size and type.static Instruction
createNull(Type type)
Create "null" value for reference types, 0 for basic types like intstatic StackInstruction
createPop(int size)
InstructionList
createPrintln(java.lang.String s)
Create a call to the most popular System.out.println() method.PUTFIELD
createPutField(java.lang.String className, java.lang.String name, Type t)
PUTSTATIC
createPutStatic(java.lang.String className, java.lang.String name, Type t)
static ReturnInstruction
createReturn(Type type)
Create typed returnstatic LocalVariableInstruction
createStore(Type type, int index)
static Instruction
createThis()
Create reference to 'this'ClassGen
getClassGen()
ConstantPoolGen
getConstantPool()
private static boolean
isString(Type type)
void
setClassGen(ClassGen c)
void
setConstantPool(ConstantPoolGen c)
-
-
-
Field Detail
-
APPEND
private static final java.lang.String APPEND
- See Also:
- Constant Field Values
-
FQCN_STRING_BUFFER
private static final java.lang.String FQCN_STRING_BUFFER
- See Also:
- Constant Field Values
-
shortNames
private static final java.lang.String[] shortNames
-
appendMethodObjects
private static final InstructionFactory.MethodObject[] appendMethodObjects
-
cg
@Deprecated protected ClassGen cg
Deprecated.(since 6.0) will be made private; do not access directly, use getter/setter
-
cp
@Deprecated protected ConstantPoolGen cp
Deprecated.(since 6.0) will be made private; do not access directly, use getter/setter
-
-
Constructor Detail
-
InstructionFactory
public InstructionFactory(ClassGen cg)
Initialize with ClassGen object
-
InstructionFactory
public InstructionFactory(ClassGen cg, ConstantPoolGen cp)
-
InstructionFactory
public InstructionFactory(ConstantPoolGen cp)
Initialize just with ConstantPoolGen object
-
-
Method Detail
-
createArrayLoad
public static ArrayInstruction createArrayLoad(Type type)
- Parameters:
type
- type of elements of array, i.e., array.getElementType()
-
createArrayStore
public static ArrayInstruction createArrayStore(Type type)
- Parameters:
type
- type of elements of array, i.e., array.getElementType()
-
createBinaryDoubleOp
private static ArithmeticInstruction createBinaryDoubleOp(char op)
-
createBinaryFloatOp
private static ArithmeticInstruction createBinaryFloatOp(char op)
-
createBinaryIntOp
private static ArithmeticInstruction createBinaryIntOp(char first, java.lang.String op)
-
createBinaryLongOp
private static ArithmeticInstruction createBinaryLongOp(char first, java.lang.String op)
Create an invokedynamic instruction.- Parameters:
bootstrap_index
- index into the bootstrap_methods arrayname
- name of the called methodret_type
- return type of methodargTypes
- argument types of method- See Also:
Const
-
createBinaryOperation
public static ArithmeticInstruction createBinaryOperation(java.lang.String op, Type type)
Create binary operation for simple basic types, such as int and float.- Parameters:
op
- operation, such as "+", "*", "<<", etc.
-
createBranchInstruction
public static BranchInstruction createBranchInstruction(short opcode, InstructionHandle target)
Create branch instruction by given opcode, except LOOKUPSWITCH and TABLESWITCH. For those you should use the SWITCH compound instruction.
-
createDup
public static StackInstruction createDup(int size)
- Parameters:
size
- size of operand, either 1 (int, e.g.) or 2 (double)
-
createDup_1
public static StackInstruction createDup_1(int size)
- Parameters:
size
- size of operand, either 1 (int, e.g.) or 2 (double)
-
createDup_2
public static StackInstruction createDup_2(int size)
- Parameters:
size
- size of operand, either 1 (int, e.g.) or 2 (double)
-
createLoad
public static LocalVariableInstruction createLoad(Type type, int index)
- Parameters:
index
- index of local variable
-
createNull
public static Instruction createNull(Type type)
Create "null" value for reference types, 0 for basic types like int
-
createPop
public static StackInstruction createPop(int size)
- Parameters:
size
- size of operand, either 1 (int, e.g.) or 2 (double)
-
createReturn
public static ReturnInstruction createReturn(Type type)
Create typed return
-
createStore
public static LocalVariableInstruction createStore(Type type, int index)
- Parameters:
index
- index of local variable
-
createThis
public static Instruction createThis()
Create reference to 'this'
-
isString
private static boolean isString(Type type)
-
createAppend
public Instruction createAppend(Type type)
-
createCast
public Instruction createCast(Type srcType, Type destType)
Create conversion operation for two stack operands, this may be an I2C, instruction, e.g., if the operands are basic types and CHECKCAST if they are reference types.
-
createCheckCast
public CHECKCAST createCheckCast(ReferenceType t)
-
createConstant
public Instruction createConstant(java.lang.Object value)
Uses PUSH to push a constant value onto the stack.- Parameters:
value
- must be of type Number, Boolean, Character or String
-
createFieldAccess
public FieldInstruction createFieldAccess(java.lang.String className, java.lang.String name, Type type, short kind)
Create a field instruction.- Parameters:
className
- name of the accessed classname
- name of the referenced fieldtype
- type of fieldkind
- how to access, i.e., GETFIELD, PUTFIELD, GETSTATIC, PUTSTATIC- See Also:
Const
-
createGetField
public GETFIELD createGetField(java.lang.String className, java.lang.String name, Type t)
-
createGetStatic
public GETSTATIC createGetStatic(java.lang.String className, java.lang.String name, Type t)
-
createInstanceOf
public INSTANCEOF createInstanceOf(ReferenceType t)
-
createInvoke
private InvokeInstruction createInvoke(InstructionFactory.MethodObject m, short kind)
-
createInvoke
public InvokeInstruction createInvoke(java.lang.String className, java.lang.String name, Type retType, Type[] argTypes, short kind)
Create an invoke instruction. (Except for invokedynamic.)- Parameters:
className
- name of the called classname
- name of the called methodretType
- return type of methodargTypes
- argument types of methodkind
- how to invoke, i.e., INVOKEINTERFACE, INVOKESTATIC, INVOKEVIRTUAL, or INVOKESPECIAL- See Also:
Const
-
createInvoke
public InvokeInstruction createInvoke(java.lang.String className, java.lang.String name, Type retType, Type[] argTypes, short kind, boolean useInterface)
Create an invoke instruction. (Except for invokedynamic.)- Parameters:
className
- name of the called classname
- name of the called methodretType
- return type of methodargTypes
- argument types of methodkind
- how to invoke: INVOKEINTERFACE, INVOKESTATIC, INVOKEVIRTUAL, or INVOKESPECIALuseInterface
- force use of InterfaceMethodref- Returns:
- A new InvokeInstruction.
- Since:
- 6.5.0
-
createNew
public NEW createNew(ObjectType t)
-
createNew
public NEW createNew(java.lang.String s)
-
createNewArray
public Instruction createNewArray(Type t, short dim)
Create new array of given size and type.- Returns:
- an instruction that creates the corresponding array at runtime, i.e. is an AllocationInstruction
-
createPrintln
public InstructionList createPrintln(java.lang.String s)
Create a call to the most popular System.out.println() method.- Parameters:
s
- the string to print
-
createPutField
public PUTFIELD createPutField(java.lang.String className, java.lang.String name, Type t)
-
createPutStatic
public PUTSTATIC createPutStatic(java.lang.String className, java.lang.String name, Type t)
-
getClassGen
public ClassGen getClassGen()
-
getConstantPool
public ConstantPoolGen getConstantPool()
-
setClassGen
public void setClassGen(ClassGen c)
-
setConstantPool
public void setConstantPool(ConstantPoolGen c)
-
-