public class ClassGeneratorUtil
extends java.lang.Object
implements bsh.org.objectweb.asm.Constants
Stub classes contain all of the fields of a BeanShell scripted class as well as two "callback" references to BeanShell namespaces: one for static methods and one for instance methods. Methods of the class are delegators which invoke corresponding methods on either the static or instance bsh object and then unpack and return the results. The static namespace utilizes a static import to delegate variable access to the class' static fields. The instance namespace utilizes a dynamic import (i.e. mixin) to delegate variable access to the class' instance variables.
Constructors for the class delegate to the static initInstance() method of ClassGeneratorUtil to initialize new instances of the object. initInstance() invokes the instance intializer code (init vars and instance blocks) and then delegates to the corresponding scripted constructor method in the instance namespace. Constructors contain special switch logic which allows the BeanShell to control the calling of alternate constructors (this() or super() references) at runtime.
Specially named superclass delegator methods are also generated in order to allow BeanShell to access overridden methods of the superclass (which reflection does not normally allow).
TODO: We have hooks for generating static initializer code, now used to save persistent class stubs. This must be extended to accommodate general static initializer blocks.
Modifier and Type | Class and Description |
---|---|
static class |
ClassGeneratorUtil.ConstructorArgs
A ConstructorArgs object holds evaluated arguments for a constructor
call as well as the index of a possible alternate selector to invoke.
|
AALOAD, AASTORE, ACC_ABSTRACT, ACC_DEPRECATED, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DREM, DRETURN, DSTORE, 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, FLOAD, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, 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, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH
Constructor and Description |
---|
ClassGeneratorUtil(Modifiers classModifiers,
java.lang.String className,
java.lang.String packageName,
java.lang.Class superClass,
java.lang.Class[] interfaces,
Variable[] vars,
DelayedEvalBshMethod[] bshmethods,
boolean isInterface) |
Modifier and Type | Method and Description |
---|---|
byte[] |
generateClass(boolean generateInitCode)
Generate the class bytecode for this class.
|
static void |
generateParameterReifierCode(java.lang.String[] paramTypes,
boolean isStatic,
bsh.org.objectweb.asm.CodeVisitor cv)
Generates the code to reify the arguments of the given method.
|
static void |
generateReturnCode(java.lang.String returnType,
bsh.org.objectweb.asm.CodeVisitor cv)
Generates the code to unreify the result of the given method.
|
static ClassGeneratorUtil.ConstructorArgs |
getConstructorArgs(java.lang.String superClassName,
This classStaticThis,
java.lang.Object[] consArgs,
int index)
This method is called by the **generated class** during construction.
|
static void |
initInstance(java.lang.Object instance,
java.lang.String className,
java.lang.Object[] args)
This method is called from the **generated class** constructor to
evaluate the instance initializer (instance blocks and loosely typed
statements) and then the scripted constructor,
in the instance namespace.
|
static void |
initStatic(java.lang.Class genClass)
The class is "cold" (detached with no live interpreter static
This reference) try to start a new interpreter and source the
script backing it.
|
void |
initStaticNameSpace(NameSpace classStaticNameSpace,
bsh.BSHBlock instanceInitBlock)
This method provides a hook for the class generator implementation to
store additional information in the class's bsh static namespace.
|
static void |
startInterpreterForClass(java.lang.Class genClass)
Attempt to load a script named for the class: e.g.
|
public ClassGeneratorUtil(Modifiers classModifiers, java.lang.String className, java.lang.String packageName, java.lang.Class superClass, java.lang.Class[] interfaces, Variable[] vars, DelayedEvalBshMethod[] bshmethods, boolean isInterface)
packageName
- e.g. "com.foo.bar"public void initStaticNameSpace(NameSpace classStaticNameSpace, bsh.BSHBlock instanceInitBlock)
public byte[] generateClass(boolean generateInitCode)
public static void generateParameterReifierCode(java.lang.String[] paramTypes, boolean isStatic, bsh.org.objectweb.asm.CodeVisitor cv)
cv
- the code visitor to be used to generate the bytecode.isStatic
- the enclosing methods is staticpublic static void generateReturnCode(java.lang.String returnType, bsh.org.objectweb.asm.CodeVisitor cv)
cv
- the code visitor to be used to generate the bytecode.public static ClassGeneratorUtil.ConstructorArgs getConstructorArgs(java.lang.String superClassName, This classStaticThis, java.lang.Object[] consArgs, int index)
consArgs
- the arguments to the constructor. These are necessary in
the evaluation of the alt constructor args. e.g. Foo(a) { super(a); }public static void initInstance(java.lang.Object instance, java.lang.String className, java.lang.Object[] args)
public static void initStatic(java.lang.Class genClass)
public static void startInterpreterForClass(java.lang.Class genClass)
? 2000-2005 pat@pat.net :-)