Package javassist.bytecode

Examples of javassist.bytecode.MethodInfo


       
    }
   
    private void addMethodAnnotation(final CtMethod ctMethod, final Annotation annotation) {

        MethodInfo methodInfo = ctMethod.getMethodInfo();

        AnnotationsAttribute attribute = (AnnotationsAttribute) methodInfo
            .getAttribute(AnnotationsAttribute.visibleTag);

        if (attribute == null) {
            attribute = new AnnotationsAttribute(getConstPool(), AnnotationsAttribute.visibleTag);
        }

        final javassist.bytecode.annotation.Annotation copy = toJavassistAnnotation(annotation);

        attribute.addAnnotation(copy);

        methodInfo.addAttribute(attribute);

    }
View Full Code Here


  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());
    minfo.setAccessFlags(AccessFlag.PUBLIC);
    classfile.addMethod(minfo);
  }
View Full Code Here

  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());
    minfo.setAccessFlags(AccessFlag.PUBLIC);
    classfile.addMethod(minfo);
  }
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);
    code.addIndex(4);
    // *return // each type
    addTypeDependDataReturn(code, finfo.getDescriptor());
    // *store_1 // each type
    addTypeDependDataStore(code, finfo.getDescriptor(), 1);
    // aload_0
    code.addAload(0);
    // invokeinterface // invoke Enabled.getInterceptFieldCallback()
    code.addInvokeinterface(enabled_class_index,
                            GETFIELDHANDLER_METHOD_NAME, GETFIELDHANDLER_METHOD_DESCRIPTOR,
                            1);
    // aload_0
    code.addAload(0);
    // ldc // name of the field
    code.addLdc(finfo.getName());
    // *load_1 // each type
    addTypeDependDataLoad(code, finfo.getDescriptor(), 1);
    // invokeinterface // invoke Callback.read*() // each type
    addInvokeFieldHandlerMethod(classfile, code, finfo.getDescriptor(),
                                true);
    // *return // each type
    addTypeDependDataReturn(code, finfo.getDescriptor());

    minfo.setCodeAttribute(code.toCodeAttribute());
    minfo.setAccessFlags(AccessFlag.PUBLIC);
    classfile.addMethod(minfo);
  }
View Full Code Here

  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);
    // aload_0
    code.addAload(0);
    // dup
    code.addOpcode(Opcode.DUP);
    // invokeinterface // enabled.getInterceptFieldCallback()
    code.addInvokeinterface(enabled_class_index,
                            GETFIELDHANDLER_METHOD_NAME, GETFIELDHANDLER_METHOD_DESCRIPTOR,
                            1);
    // aload_0
    code.addAload(0);
    // ldc // field name
    code.addLdc(finfo.getName());
    // aload_0
    code.addAload(0);
    // getfield // old value of the field
    code.addOpcode(Opcode.GETFIELD);
    code.addIndex(base_field_index);
    code.growStack(Descriptor.dataSize(finfo.getDescriptor()) - 1);
    // *load_1
    addTypeDependDataLoad(code, finfo.getDescriptor(), 1);
    // invokeinterface // callback.write*(..)
    addInvokeFieldHandlerMethod(classfile, code, finfo.getDescriptor(),
                                false);
    // putfield // new value of the field
    code.addOpcode(Opcode.PUTFIELD);
    code.addIndex(base_field_index);
    code.growStack(-Descriptor.dataSize(finfo.getDescriptor()));
    // return
    code.addOpcode(Opcode.RETURN);

    minfo.setCodeAttribute(code.toCodeAttribute());
    minfo.setAccessFlags(AccessFlag.PUBLIC);
    classfile.addMethod(minfo);
  }
View Full Code Here

  private void transformInvokevirtualsIntoPutAndGetfields(ClassFile classfile)
      throws CannotCompileException {
    List methods = classfile.getMethods();
    for (Iterator method_iter = methods.iterator(); method_iter.hasNext();) {
      MethodInfo minfo = (MethodInfo) method_iter.next();
      String methodName = minfo.getName();
      if (methodName.startsWith(EACH_READ_METHOD_PREFIX)
          || methodName.startsWith(EACH_WRITE_METHOD_PREFIX)
          || methodName.equals(GETFIELDHANDLER_METHOD_NAME)
          || methodName.equals(SETFIELDHANDLER_METHOD_NAME)) {
        continue;
      }
      CodeAttribute codeAttr = minfo.getCodeAttribute();
      if (codeAttr == null) {
        return;
      }
      CodeIterator iter = codeAttr.iterator();
      while (iter.hasNext()) {
View Full Code Here

      }
   }

   protected void moveAnnotationsAndCopySignature(CtMethod src, CtMethod dest) throws NotFoundException
   {
      MethodInfo mi = src.getMethodInfo2();
      MethodInfo wmi = dest.getMethodInfo2();

      moveAnnotations(mi, wmi, AnnotationsAttribute.invisibleTag);
      moveAnnotations(mi, wmi, AnnotationsAttribute.visibleTag);
      int numParams = src.getParameterTypes().length;
      moveParameterAnnotations(numParams, mi, wmi, ParameterAnnotationsAttribute.visibleTag);
View Full Code Here

  }

  private void addGetFieldHandlerMethod(ClassFile classfile) throws CannotCompileException, BadBytecode {
    final ConstPool constPool = classfile.getConstPool();
    final int thisClassInfo = constPool.getThisClassInfo();
    final MethodInfo getterMethodInfo = new MethodInfo(
        constPool,
        GETFIELDHANDLER_METHOD_NAME,
        GETFIELDHANDLER_METHOD_DESCRIPTOR
    );

    /* local variable | this | */
    final Bytecode code = new Bytecode( constPool, 2, 1 );
    // aload_0 // load this
    code.addAload( 0 );
    // getfield // get field "$JAVASSIST_CALLBACK" defined already
    code.addOpcode( Opcode.GETFIELD );
    final int fieldIndex = constPool.addFieldrefInfo( thisClassInfo, HANDLER_FIELD_NAME, HANDLER_FIELD_DESCRIPTOR );
    code.addIndex( fieldIndex );
    // areturn // return the value of the field
    code.addOpcode( Opcode.ARETURN );
    getterMethodInfo.setCodeAttribute( code.toCodeAttribute() );
    getterMethodInfo.setAccessFlags( AccessFlag.PUBLIC );
    final CodeAttribute codeAttribute = getterMethodInfo.getCodeAttribute();
    if ( codeAttribute != null ) {
      final StackMapTable smt = MapMaker.make( classPool, getterMethodInfo );
      codeAttribute.setAttribute( smt );
    }
    classfile.addMethod( getterMethodInfo );
View Full Code Here

  }

  private void addSetFieldHandlerMethod(ClassFile classfile) throws CannotCompileException, BadBytecode {
    final ConstPool constPool = classfile.getConstPool();
    final int thisClassInfo = constPool.getThisClassInfo();
    final MethodInfo methodInfo = new MethodInfo(
        constPool,
        SETFIELDHANDLER_METHOD_NAME,
        SETFIELDHANDLER_METHOD_DESCRIPTOR
    );

    /* local variables | this | callback | */
    final Bytecode code = new Bytecode(constPool, 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 );
    final int fieldIndex = constPool.addFieldrefInfo( thisClassInfo, HANDLER_FIELD_NAME, HANDLER_FIELD_DESCRIPTOR );
    code.addIndex( fieldIndex );
    // return
    code.addOpcode( Opcode.RETURN );
    methodInfo.setCodeAttribute( code.toCodeAttribute() );
    methodInfo.setAccessFlags( AccessFlag.PUBLIC );
    final CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
    if ( codeAttribute != null ) {
      final StackMapTable smt = MapMaker.make( classPool, methodInfo );
      codeAttribute.setAttribute( smt );
    }
    classfile.addMethod( methodInfo );
View Full Code Here

  private void addReadMethod(ClassFile classfile, FieldInfo finfo) throws CannotCompileException, BadBytecode {
    final ConstPool constPool = classfile.getConstPool();
    final int thisClassInfo = constPool.getThisClassInfo();
    final String readMethodDescriptor = "()" + finfo.getDescriptor();
    final MethodInfo readMethodInfo = new MethodInfo(
        constPool,
        EACH_READ_METHOD_PREFIX + finfo.getName(),
        readMethodDescriptor
    );

    /* local variables | target obj | each oldvalue | */
    final Bytecode code = new Bytecode(constPool, 5, 3);
    // aload_0
    code.addAload( 0 );
    // getfield // get each field
    code.addOpcode( Opcode.GETFIELD );
    final int baseFieldIndex = constPool.addFieldrefInfo( thisClassInfo, finfo.getName(), finfo.getDescriptor() );
    code.addIndex( baseFieldIndex );
    // aload_0
    code.addAload( 0 );
    // invokeinterface : invoke Enabled.getInterceptFieldCallback()
    final int enabledClassIndex = constPool.addClassInfo( FIELD_HANDLED_TYPE_NAME );
    code.addInvokeinterface(
        enabledClassIndex,
        GETFIELDHANDLER_METHOD_NAME,
        GETFIELDHANDLER_METHOD_DESCRIPTOR,
        1
    );
    // ifnonnull
    code.addOpcode( Opcode.IFNONNULL );
    code.addIndex( 4 );
    // *return // each type
    addTypeDependDataReturn( code, finfo.getDescriptor() );
    // *store_1 // each type
    addTypeDependDataStore( code, finfo.getDescriptor(), 1 );
    // aload_0
    code.addAload( 0 );
    // invokeinterface // invoke Enabled.getInterceptFieldCallback()
    code.addInvokeinterface(
        enabledClassIndex,
        GETFIELDHANDLER_METHOD_NAME, GETFIELDHANDLER_METHOD_DESCRIPTOR,
        1
    );
    // aload_0
    code.addAload( 0 );
    // ldc // name of the field
    code.addLdc( finfo.getName() );
    // *load_1 // each type
    addTypeDependDataLoad( code, finfo.getDescriptor(), 1 );
    // invokeinterface // invoke Callback.read*() // each type
    addInvokeFieldHandlerMethod(
        classfile, code, finfo.getDescriptor(),
        true
    );
    // *return // each type
    addTypeDependDataReturn( code, finfo.getDescriptor() );

    readMethodInfo.setCodeAttribute( code.toCodeAttribute() );
    readMethodInfo.setAccessFlags( AccessFlag.PUBLIC );
    final CodeAttribute codeAttribute = readMethodInfo.getCodeAttribute();
    if ( codeAttribute != null ) {
      final StackMapTable smt = MapMaker.make( classPool, readMethodInfo );
      codeAttribute.setAttribute( smt );
    }
    classfile.addMethod( readMethodInfo );
View Full Code Here

TOP

Related Classes of javassist.bytecode.MethodInfo

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.