Package javassist.bytecode

Examples of javassist.bytecode.Bytecode

This program produces a Code attribute including a bytecode sequence:

@see ConstPool @see CodeAttribute

    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 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
    code.addAload( 0 );
    // invokespecial
    code.addInvokespecial( BulkAccessor.class.getName(), MethodInfo.nameInit, cons_desc );
    // return
    code.addOpcode( Opcode.RETURN );

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

    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 | */
    if ( getters.length >= 0 ) {
      // aload_1 // load bean
      code.addAload( 1 );
      // checkcast // cast bean
      code.addCheckcast( this.targetBean.getName() );
      // astore_3 // store bean
      code.addAstore( 3 );
      for ( int i = 0; i < getters.length; ++i ) {
        if ( getters[i] != null ) {
          Method getter = getters[i];
          // aload_2 // args
          code.addAload( 2 );
          // iconst_i // continue to aastore
          code.addIconst( i ); // growing stack is 1
          Class returnType = getter.getReturnType();
          int typeIndex = -1;
          if ( returnType.isPrimitive() ) {
            typeIndex = FactoryHelper.typeIndex( returnType );
            // new
            code.addNew( FactoryHelper.wrapperTypes[typeIndex] );
            // dup
            code.addOpcode( Opcode.DUP );
          }

          // aload_3 // load the raw bean
          code.addAload( 3 );
          String getter_desc = RuntimeSupport.makeDescriptor( getter );
          String getterName = getter.getName();
          if ( this.targetBean.isInterface() ) {
            // invokeinterface
            code.addInvokeinterface( target_type_index, getterName, getter_desc, 1 );
          }
          else {
            // invokevirtual
            code.addInvokevirtual( target_type_index, getterName, getter_desc );
          }

          if ( typeIndex >= 0 ) {       // is a primitive type
            // invokespecial
            code.addInvokespecial(
                FactoryHelper.wrapperTypes[typeIndex],
                    MethodInfo.nameInit,
                    FactoryHelper.wrapperDesc[typeIndex]
            );
          }

          // aastore // args
          code.add( Opcode.AASTORE );
          code.growStack( -3 );
        }
      }
    }
    // return
    code.addOpcode( Opcode.RETURN );

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

    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 );
      // dup
      code.addOpcode( Opcode.DUP );
      // aload 5 // load exception
      code.addAload( 5 );
      // iload_3 // i
      code.addIload( 3 );
      // invokespecial // BulkAccessorException.<init>
      String cons_desc = "(Ljava/lang/Throwable;I)V";
      code.addInvokespecial( BULKEXCEPTION_CLASS_NAME, MethodInfo.nameInit, cons_desc );
      // athrow
      code.addOpcode( Opcode.ATHROW );
    }
    else {
      // return
      code.addOpcode( Opcode.RETURN );
    }

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

                field.setAccessFlags(Modifier.PUBLIC);
                file.addField(field);
                for (final MethodInfo method : (List<MethodInfo>) file.getMethods()) {
                    if (method.getName().equals("init") &&
                            method.getDescriptor().equals("(Ljavax/servlet/FilterConfig;)V")) {
                        final Bytecode b = new Bytecode(file.getConstPool());
                        b.addAload(0);
                        b.addAload(1);
                        b.addPutfield(ResteasyExtension.FILTER_DISPATCHER, FIELD_NAME, FILTER_FIELD_TYPE);
                        b.addAload(1);
                        b.addInvokeinterface("javax/servlet/FilterConfig", "getServletContext", "()Ljavax/servlet/ServletContext;", 1);
                        b.addAload(0);
                        b.addGetfield(ResteasyExtension.FILTER_DISPATCHER, PARAMETER_FIELD_NAME, SET_TYPE);
                        b.addInvokestatic(CONTEXT_PARAMS, "init", INIT_METHOD_DESC);
                        b.addAload(0);
                        b.add(Opcode.SWAP);
                        b.addPutfield(ResteasyExtension.FILTER_DISPATCHER, PARAMETER_FIELD_NAME, SET_TYPE);
                        method.getCodeAttribute().iterator().insert(b.get());
                        method.getCodeAttribute().computeMaxStack();
                    } else if(method.getName().equals("<init>")) {
                        //no idea why this is needed
                        method.getCodeAttribute().setMaxStack(1);
                    }
                }
                return true;
            } else if (file.getName().equals(ResteasyExtension.SERVLET_DISPATCHER)) {
                FieldInfo field = new FieldInfo(file.getConstPool(), FIELD_NAME, SERVLET_FIELD_TYPE);
                field.setAccessFlags(Modifier.PUBLIC);
                file.addField(field);
                field = new FieldInfo(file.getConstPool(), PARAMETER_FIELD_NAME, SET_TYPE);
                field.setAccessFlags(Modifier.PUBLIC);
                file.addField(field);
                for (final MethodInfo method : (List<MethodInfo>) file.getMethods()) {
                    if (method.getName().equals("init") &&
                            method.getDescriptor().equals("(Ljavax/servlet/ServletConfig;)V")) {
                        final Bytecode b = new Bytecode(file.getConstPool());
                        b.addAload(0);
                        b.addAload(1);
                        b.addPutfield(ResteasyExtension.SERVLET_DISPATCHER, FIELD_NAME, SERVLET_FIELD_TYPE);
                        b.addAload(1);
                        b.addInvokeinterface("javax/servlet/ServletConfig", "getServletContext", "()Ljavax/servlet/ServletContext;", 1);
                        b.addAload(0);
                        b.addGetfield(ResteasyExtension.SERVLET_DISPATCHER, PARAMETER_FIELD_NAME, SET_TYPE);
                        b.addInvokestatic(CONTEXT_PARAMS, "init", INIT_METHOD_DESC);
                        b.addAload(0);
                        b.add(Opcode.SWAP);
                        b.addPutfield(ResteasyExtension.SERVLET_DISPATCHER, PARAMETER_FIELD_NAME, SET_TYPE);
                        method.getCodeAttribute().iterator().insert(b.get());
                        method.getCodeAttribute().computeMaxStack();
                    } else if(method.getName().equals("<init>")) {
                        method.getCodeAttribute().setMaxStack(1);
                    }
                }
View Full Code Here

                if (method.getName().equals("createContainerEntityManagerFactory")) {

                    //need to save the method params so we can re-use them when we re-create our EMF
                    final int oldMax = method.getCodeAttribute().getMaxLocals();
                    method.getCodeAttribute().setMaxLocals(oldMax + 2);
                    Bytecode s = new Bytecode(file.getConstPool());
                    s.addAload(1);
                    s.addAstore(oldMax);
                    s.addAload(2);
                    s.addAstore(oldMax + 1);

                    //we need to interceptor the return value
                    //and add in our own bytecode fragment.
                    //first lets create our proxy creation code
                    final Bytecode b = new Bytecode(file.getConstPool());
                    b.addNew(PROXY_NAME);
                    b.add(Opcode.DUP_X1);
                    b.add(Opcode.SWAP);
                    b.addAload(0);
                    b.addAload(oldMax);
                    b.addAload(oldMax + 1);
                    b.addInvokespecial(PROXY_NAME, "<init>", "(Ljavax/persistence/EntityManagerFactory;Lorg/hibernate/ejb/HibernatePersistence;Ljavax/persistence/spi/PersistenceUnitInfo;Ljava/util/Map;)V");

                    insertBeforeReturn(method, s, b);
                } else if (method.getName().equals("createEntityManagerFactory") &&
                        method.getDescriptor().equals("(Ljava/lang/String;Ljava/util/Map;)Ljavax/persistence/EntityManagerFactory;")) {

                    //need to save the method params so we can re-use them when we re-create our EMF
                    final int oldMax = method.getCodeAttribute().getMaxLocals();
                    method.getCodeAttribute().setMaxLocals(oldMax + 2);
                    Bytecode s = new Bytecode(file.getConstPool());
                    s.addAload(1);
                    s.addAstore(oldMax);
                    s.addAload(2);
                    s.addAstore(oldMax + 1);

                    //we need to interceptor the return value
                    //and add in our own bytecode fragment.
                    //first lets create our proxy creation code
                    final Bytecode b = new Bytecode(file.getConstPool());
                    b.addNew(PROXY_NAME);
                    b.add(Opcode.DUP_X1);
                    b.add(Opcode.SWAP);
                    b.addAload(0);
                    b.addAload(oldMax);
                    b.addAload(oldMax + 1);
                    b.addInvokespecial(PROXY_NAME, "<init>", "(Ljavax/persistence/EntityManagerFactory;Lorg/hibernate/ejb/HibernatePersistence;Ljava/lang/String;Ljava/util/Map;)V");

                    insertBeforeReturn(method, s, b);
                } else if (method.getName().equals("createEntityManagerFactory") &&
                        method.getDescriptor().equals("(Ljava/util/Map;)Ljavax/persistence/EntityManagerFactory;")) {

                    //need to save the method params so we can re-use them when we re-create our EMF
                    final int oldMax = method.getCodeAttribute().getMaxLocals();
                    method.getCodeAttribute().setMaxLocals(oldMax + 1);
                    Bytecode s = new Bytecode(file.getConstPool());
                    s.addAload(1);
                    s.addAstore(oldMax);

                    //we need to interceptor the return value
                    //and add in our own bytecode fragment.
                    //first lets create our proxy creation code
                    final Bytecode b = new Bytecode(file.getConstPool());
                    b.addNew(PROXY_NAME);
                    b.add(Opcode.DUP_X1);
                    b.add(Opcode.SWAP);
                    b.addAload(0);
                    b.add(Opcode.ACONST_NULL);
                    b.addAload(oldMax);
                    b.addInvokespecial(PROXY_NAME, "<init>", "(Ljavax/persistence/EntityManagerFactory;Lorg/hibernate/ejb/HibernatePersistence;Ljava/lang/String;Ljava/util/Map;)V");

                    insertBeforeReturn(method, s, b);
                }
            }
            return true;
View Full Code Here

  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
    code.addAload( 0 );
    // invokespecial
    code.addInvokespecial( BulkAccessor.class.getName(), MethodInfo.nameInit, cons_desc );
    // return
    code.addOpcode( Opcode.RETURN );

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

    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 | */
    if ( getters.length >= 0 ) {
      // aload_1 // load bean
      code.addAload( 1 );
      // checkcast // cast bean
      code.addCheckcast( this.targetBean.getName() );
      // astore_3 // store bean
      code.addAstore( 3 );
      for ( int i = 0; i < getters.length; ++i ) {
        if ( getters[i] != null ) {
          Method getter = getters[i];
          // aload_2 // args
          code.addAload( 2 );
          // iconst_i // continue to aastore
          code.addIconst( i ); // growing stack is 1
          Class returnType = getter.getReturnType();
          int typeIndex = -1;
          if ( returnType.isPrimitive() ) {
            typeIndex = FactoryHelper.typeIndex( returnType );
            // new
            code.addNew( FactoryHelper.wrapperTypes[typeIndex] );
            // dup
            code.addOpcode( Opcode.DUP );
          }

          // aload_3 // load the raw bean
          code.addAload( 3 );
          String getter_desc = RuntimeSupport.makeDescriptor( getter );
          String getterName = getter.getName();
          if ( this.targetBean.isInterface() ) {
            // invokeinterface
            code.addInvokeinterface( target_type_index, getterName, getter_desc, 1 );
          }
          else {
            // invokevirtual
            code.addInvokevirtual( target_type_index, getterName, getter_desc );
          }

          if ( typeIndex >= 0 ) {       // is a primitive type
            // invokespecial
            code.addInvokespecial(
                FactoryHelper.wrapperTypes[typeIndex],
                    MethodInfo.nameInit,
                    FactoryHelper.wrapperDesc[typeIndex]
            );
          }

          // aastore // args
          code.add( Opcode.AASTORE );
          code.growStack( -3 );
        }
      }
    }
    // return
    code.addOpcode( Opcode.RETURN );

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

    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 );
      // dup
      code.addOpcode( Opcode.DUP );
      // aload 5 // load exception
      code.addAload( 5 );
      // iload_3 // i
      code.addIload( 3 );
      // invokespecial // BulkAccessorException.<init>
      String cons_desc = "(Ljava/lang/Throwable;I)V";
      code.addInvokespecial( BULKEXCEPTION_CLASS_NAME, MethodInfo.nameInit, cons_desc );
      // athrow
      code.addOpcode( Opcode.ATHROW );
    }
    else {
      // return
      code.addOpcode( Opcode.RETURN );
    }

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

    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

TOP

Related Classes of javassist.bytecode.Bytecode

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.