Package javassist.bytecode

Examples of javassist.bytecode.ConstPool


   *
   * @param classfile
   * @throws CannotCompileException
   */
  private void addDefaultConstructor(ClassFile classfile) throws CannotCompileException {
    ConstPool cp = classfile.getConstPool();
    String cons_desc = "()V";
    MethodInfo mi = new MethodInfo( cp, MethodInfo.nameInit, cons_desc );

    Bytecode code = new Bytecode( cp, 0, 1 );
    // aload_0
View Full Code Here


    mi.setAccessFlags( AccessFlag.PUBLIC );
    classfile.addMethod( mi );
  }

  private void addGetter(ClassFile classfile, final Method[] getters) throws CannotCompileException {
    ConstPool cp = classfile.getConstPool();
    int target_type_index = cp.addClassInfo( this.targetBean.getName() );
    String desc = GET_SETTER_DESC;
    MethodInfo mi = new MethodInfo( cp, GENERATED_GETTER_NAME, desc );

    Bytecode code = new Bytecode( cp, 6, 4 );
    /* | this | bean | args | raw bean | */
 
View Full Code Here

    mi.setAccessFlags( AccessFlag.PUBLIC );
    classfile.addMethod( mi );
  }

  private void addSetter(ClassFile classfile, final Method[] setters) throws CannotCompileException {
    ConstPool cp = classfile.getConstPool();
    int target_type_index = cp.addClassInfo( this.targetBean.getName() );
    String desc = GET_SETTER_DESC;
    MethodInfo mi = new MethodInfo( cp, GENERATED_SETTER_NAME, desc );

    Bytecode code = new Bytecode( cp, 4, 6 );
    /* | this | bean | args | i | raw bean | exception | */
    if ( setters.length > 0 ) {
      int start, end; // required to exception table
      // iconst_0 // i
      code.addIconst( 0 );
      // istore_3 // store i
      code.addIstore( 3 );
      // aload_1 // load the bean
      code.addAload( 1 );
      // checkcast // cast the bean into a raw bean
      code.addCheckcast( this.targetBean.getName() );
      // astore 4 // store the raw bean
      code.addAstore( 4 );
      /* current stack len = 0 */
      // start region to handling exception (BulkAccessorException)
      start = code.currentPc();
      int lastIndex = 0;
      for ( int i = 0; i < setters.length; ++i ) {
        if ( setters[i] != null ) {
          int diff = i - lastIndex;
          if ( diff > 0 ) {
            // iinc 3, 1
            code.addOpcode( Opcode.IINC );
            code.add( 3 );
            code.add( diff );
            lastIndex = i;
          }
        }
        /* current stack len = 0 */
        // aload 4 // load the raw bean
        code.addAload( 4 );
        // aload_2 // load the args
        code.addAload( 2 );
        // iconst_i
        code.addIconst( i );
        // aaload
        code.addOpcode( Opcode.AALOAD );
        // checkcast
        Class[] setterParamTypes = setters[i].getParameterTypes();
        Class setterParamType = setterParamTypes[0];
        if ( setterParamType.isPrimitive() ) {
          // checkcast (case of primitive type)
          // invokevirtual (case of primitive type)
          this.addUnwrapper( classfile, code, setterParamType );
        }
        else {
          // checkcast (case of reference type)
          code.addCheckcast( setterParamType.getName() );
        }
        /* current stack len = 2 */
        String rawSetterMethod_desc = RuntimeSupport.makeDescriptor( setters[i] );
        if ( !this.targetBean.isInterface() ) {
          // invokevirtual
          code.addInvokevirtual( target_type_index, setters[i].getName(), rawSetterMethod_desc );
        }
        else {
          // invokeinterface
          Class[] params = setters[i].getParameterTypes();
          int size;
          if ( params[0].equals( Double.TYPE ) || params[0].equals( Long.TYPE ) ) {
            size = 3;
          }
          else {
            size = 2;
          }

          code.addInvokeinterface( target_type_index, setters[i].getName(), rawSetterMethod_desc, size );
        }
      }

      // end region to handling exception (BulkAccessorException)
      end = code.currentPc();
      // return
      code.addOpcode( Opcode.RETURN );
      /* current stack len = 0 */
      // register in exception table
      int throwableType_index = cp.addClassInfo( THROWABLE_CLASS_NAME );
      code.addExceptionHandler( start, end, code.currentPc(), throwableType_index );
      // astore 5 // store exception
      code.addAstore( 5 );
      // new // BulkAccessorException
      code.addNew( BULKEXCEPTION_CLASS_NAME );
View Full Code Here

    }
  }

  private void addFieldHandlerField(ClassFile classfile)
      throws CannotCompileException {
    ConstPool cp = classfile.getConstPool();
    FieldInfo finfo = new FieldInfo(cp, HANDLER_FIELD_NAME,
                                    HANDLER_FIELD_DESCRIPTOR);
    finfo.setAccessFlags(AccessFlag.PRIVATE | AccessFlag.TRANSIENT);
    classfile.addField(finfo);
  }
View Full Code Here

    classfile.addField(finfo);
  }

  private void addGetFieldHandlerMethod(ClassFile classfile)
      throws CannotCompileException {
    ConstPool cp = classfile.getConstPool();
    int this_class_index = cp.getThisClassInfo();
    MethodInfo minfo = new MethodInfo(cp, GETFIELDHANDLER_METHOD_NAME,
                                      GETFIELDHANDLER_METHOD_DESCRIPTOR);
    /* local variable | this | */
    Bytecode code = new Bytecode(cp, 2, 1);
    // aload_0 // load this
    code.addAload(0);
    // getfield // get field "$JAVASSIST_CALLBACK" defined already
    code.addOpcode(Opcode.GETFIELD);
    int field_index = cp.addFieldrefInfo(this_class_index,
                                         HANDLER_FIELD_NAME, HANDLER_FIELD_DESCRIPTOR);
    code.addIndex(field_index);
    // areturn // return the value of the field
    code.addOpcode(Opcode.ARETURN);
    minfo.setCodeAttribute(code.toCodeAttribute());
View Full Code Here

    classfile.addMethod(minfo);
  }

  private void addSetFieldHandlerMethod(ClassFile classfile)
      throws CannotCompileException {
    ConstPool cp = classfile.getConstPool();
    int this_class_index = cp.getThisClassInfo();
    MethodInfo minfo = new MethodInfo(cp, SETFIELDHANDLER_METHOD_NAME,
                                      SETFIELDHANDLER_METHOD_DESCRIPTOR);
    /* local variables | this | callback | */
    Bytecode code = new Bytecode(cp, 3, 3);
    // aload_0 // load this
    code.addAload(0);
    // aload_1 // load callback
    code.addAload(1);
    // putfield // put field "$JAVASSIST_CALLBACK" defined already
    code.addOpcode(Opcode.PUTFIELD);
    int field_index = cp.addFieldrefInfo(this_class_index,
                                         HANDLER_FIELD_NAME, HANDLER_FIELD_DESCRIPTOR);
    code.addIndex(field_index);
    // return
    code.addOpcode(Opcode.RETURN);
    minfo.setCodeAttribute(code.toCodeAttribute());
View Full Code Here

    }
  }

  private void addReadMethod(ClassFile classfile, FieldInfo finfo)
      throws CannotCompileException {
    ConstPool cp = classfile.getConstPool();
    int this_class_index = cp.getThisClassInfo();
    String desc = "()" + finfo.getDescriptor();
    MethodInfo minfo = new MethodInfo(cp, EACH_READ_METHOD_PREFIX
                                          + finfo.getName(), desc);
    /* local variables | target obj | each oldvalue | */
    Bytecode code = new Bytecode(cp, 5, 3);
    // aload_0
    code.addAload(0);
    // getfield // get each field
    code.addOpcode(Opcode.GETFIELD);
    int base_field_index = cp.addFieldrefInfo(this_class_index, finfo
        .getName(), finfo.getDescriptor());
    code.addIndex(base_field_index);
    // aload_0
    code.addAload(0);
    // invokeinterface // invoke Enabled.getInterceptFieldCallback()
    int enabled_class_index = cp.addClassInfo(FIELD_HANDLED_TYPE_NAME);
    code.addInvokeinterface(enabled_class_index,
                            GETFIELDHANDLER_METHOD_NAME, GETFIELDHANDLER_METHOD_DESCRIPTOR,
                            1);
    // ifnonnull
    code.addOpcode(Opcode.IFNONNULL);
View Full Code Here

    classfile.addMethod(minfo);
  }

  private void addWriteMethod(ClassFile classfile, FieldInfo finfo)
      throws CannotCompileException {
    ConstPool cp = classfile.getConstPool();
    int this_class_index = cp.getThisClassInfo();
    String desc = "(" + finfo.getDescriptor() + ")V";
    MethodInfo minfo = new MethodInfo(cp, EACH_WRITE_METHOD_PREFIX
                                          + finfo.getName(), desc);
    /* local variables | target obj | each oldvalue | */
    Bytecode code = new Bytecode(cp, 6, 3);
    // aload_0
    code.addAload(0);
    // invokeinterface // enabled.getInterceptFieldCallback()
    int enabled_class_index = cp.addClassInfo(FIELD_HANDLED_TYPE_NAME);
    code.addInvokeinterface(enabled_class_index,
                            GETFIELDHANDLER_METHOD_NAME, GETFIELDHANDLER_METHOD_DESCRIPTOR,
                            1);
    // ifnonnull (label1)
    code.addOpcode(Opcode.IFNONNULL);
    code.addIndex(9);
    // aload_0
    code.addAload(0);
    // *load_1
    addTypeDependDataLoad(code, finfo.getDescriptor(), 1);
    // putfield
    code.addOpcode(Opcode.PUTFIELD);
    int base_field_index = cp.addFieldrefInfo(this_class_index, finfo
        .getName(), finfo.getDescriptor());
    code.addIndex(base_field_index);
    code.growStack(-Descriptor.dataSize(finfo.getDescriptor()));
    // return ;
    code.addOpcode(Opcode.RETURN);
View Full Code Here

      }
    }
  }

  private int transformInvokevirtualsIntoGetfields(ClassFile classfile, CodeIterator iter, int pos) {
    ConstPool cp = classfile.getConstPool();
    int c = iter.byteAt(pos);
    if (c != Opcode.GETFIELD) {
      return pos;
    }
    int index = iter.u16bitAt(pos + 1);
    String fieldName = cp.getFieldrefName(index);
    String className = cp.getFieldrefClassName(index);
    if ( !filter.handleReadAccess( className, fieldName ) ) {
      return pos;
    }
    String desc = "()" + cp.getFieldrefType( index );
    int read_method_index = cp.addMethodrefInfo(
        cp.getThisClassInfo(),
        EACH_READ_METHOD_PREFIX + fieldName,
        desc
    );
    iter.writeByte(Opcode.INVOKEVIRTUAL, pos);
    iter.write16bit(read_method_index, pos + 1);
View Full Code Here

    return pos;
  }

  private int transformInvokevirtualsIntoPutfields(ClassFile classfile,
                                                   CodeIterator iter, int pos) {
    ConstPool cp = classfile.getConstPool();
    int c = iter.byteAt(pos);
    if (c != Opcode.PUTFIELD) {
      return pos;
    }
    int index = iter.u16bitAt(pos + 1);
    String fieldName = cp.getFieldrefName(index);
    String className = cp.getFieldrefClassName(index);
    if ((!classfile.getName().equals(className))
        || (!writableFields.containsKey(fieldName))) {
      return pos;
    }
    String desc = "(" + (String) writableFields.get(fieldName) + ")V";
    int write_method_index = cp.addMethodrefInfo(cp.getThisClassInfo(),
                                                 EACH_WRITE_METHOD_PREFIX + fieldName, desc);
    iter.writeByte(Opcode.INVOKEVIRTUAL, pos);
    iter.write16bit(write_method_index, pos + 1);
    return pos;
  }
View Full Code Here

TOP

Related Classes of javassist.bytecode.ConstPool

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.