private char[][] decodeParameterTypes(char[] signature,boolean firstIsSynthetic) throws ClassFormatException {
  if (signature == null)   return null;
  int indexOfClosingParen=CharOperation.lastIndexOf(')',signature);
  if (indexOfClosingParen == 1) {
    return null;
  }
  if (indexOfClosingParen == -1) {
    throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
  }
  char[][] parameterTypes=new char[3][];
  int parameterTypesCounter=0;
  int arrayDim=0;
  for (int i=1; i < indexOfClosingParen; i++) {
    if (parameterTypesCounter == parameterTypes.length) {
      System.arraycopy(parameterTypes,0,(parameterTypes=new char[parameterTypesCounter * 2][]),0,parameterTypesCounter);
    }
switch (signature[i]) {
case 'B':
      parameterTypes[parameterTypesCounter++]=BYTE;
    if (arrayDim > 0)     convertToArrayType(parameterTypes,parameterTypesCounter - 1,arrayDim);
  arrayDim=0;
break;
case 'C':
parameterTypes[parameterTypesCounter++]=CHAR;
if (arrayDim > 0) convertToArrayType(parameterTypes,parameterTypesCounter - 1,arrayDim);
arrayDim=0;
break;
case 'D':
parameterTypes[parameterTypesCounter++]=DOUBLE;
if (arrayDim > 0) convertToArrayType(parameterTypes,parameterTypesCounter - 1,arrayDim);
arrayDim=0;
break;
case 'F':
parameterTypes[parameterTypesCounter++]=FLOAT;
if (arrayDim > 0) convertToArrayType(parameterTypes,parameterTypesCounter - 1,arrayDim);
arrayDim=0;
break;
case 'I':
parameterTypes[parameterTypesCounter++]=INT;
if (arrayDim > 0) convertToArrayType(parameterTypes,parameterTypesCounter - 1,arrayDim);
arrayDim=0;
break;
case 'J':
parameterTypes[parameterTypesCounter++]=LONG;
if (arrayDim > 0) convertToArrayType(parameterTypes,parameterTypesCounter - 1,arrayDim);
arrayDim=0;
break;
case 'L':
int indexOfSemiColon=CharOperation.indexOf(';',signature,i + 1);
if (indexOfSemiColon == -1) throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
if (firstIsSynthetic && parameterTypesCounter == 0) {
firstIsSynthetic=false;
}
 else {
parameterTypes[parameterTypesCounter++]=replace('/','.',CharOperation.subarray(signature,i + 1,indexOfSemiColon));
if (arrayDim > 0) convertToArrayType(parameterTypes,parameterTypesCounter - 1,arrayDim);
}
i=indexOfSemiColon;
arrayDim=0;
break;
case 'S':
parameterTypes[parameterTypesCounter++]=SHORT;
if (arrayDim > 0) convertToArrayType(parameterTypes,parameterTypesCounter - 1,arrayDim);
arrayDim=0;
break;
case 'Z':
parameterTypes[parameterTypesCounter++]=BOOLEAN;
if (arrayDim > 0) convertToArrayType(parameterTypes,parameterTypesCounter - 1,arrayDim);
arrayDim=0;
break;
case '[':
arrayDim++;
break;
default :
throw new ClassFormatException(ClassFormatException.ErrInvalidMethodSignature);
}
}
if (parameterTypes.length != parameterTypesCounter) {
System.arraycopy(parameterTypes,0,parameterTypes=new char[parameterTypesCounter][],0,parameterTypesCounter);
}
return parameterTypes;
}

private char [ ] [ ] decodeParameterTypes ( char [ ] signature , boolean firstIsSynthetic ) throws ClassFormatException { if ( signature == null ) return null ; int indexOfClosingParen = CharOperation . lastIndexOf ( ')' , signature ) ; if ( indexOfClosingParen == 1 ) { return null ; } if ( indexOfClosingParen == - 1 ) { throw new ClassFormatException ( ClassFormatException . ErrInvalidMethodSignature ) ; } char [ ] [ ] parameterTypes = new char [ 3 ] [ ] ; int parameterTypesCounter = 0 ; int arrayDim = 0 ; for ( int i = 1 ; i < indexOfClosingParen ; i ++ ) { if ( parameterTypesCounter == parameterTypes . length ) { System . arraycopy ( parameterTypes , 0 , ( parameterTypes = new char [ parameterTypesCounter * 2 ] [ ] ) , 0 , parameterTypesCounter ) ; } switch ( signature [ i ] ) { case 'B' : parameterTypes [ parameterTypesCounter ++ ] = BYTE ; if ( arrayDim > 0 ) convertToArrayType ( parameterTypes , parameterTypesCounter - 1 , arrayDim ) ; arrayDim = 0 ; break ; case 'C' : parameterTypes [ parameterTypesCounter ++ ] = CHAR ; if ( arrayDim > 0 ) convertToArrayType ( parameterTypes , parameterTypesCounter - 1 , arrayDim ) ; arrayDim = 0 ; break ; case 'D' : parameterTypes [ parameterTypesCounter ++ ] = DOUBLE ; if ( arrayDim > 0 ) convertToArrayType ( parameterTypes , parameterTypesCounter - 1 , arrayDim ) ; arrayDim = 0 ; break ; case 'F' : parameterTypes [ parameterTypesCounter ++ ] = FLOAT ; if ( arrayDim > 0 ) convertToArrayType ( parameterTypes , parameterTypesCounter - 1 , arrayDim ) ; arrayDim = 0 ; break ; case 'I' : parameterTypes [ parameterTypesCounter ++ ] = INT ; if ( arrayDim > 0 ) convertToArrayType ( parameterTypes , parameterTypesCounter - 1 , arrayDim ) ; arrayDim = 0 ; break ; case 'J' : parameterTypes [ parameterTypesCounter ++ ] = LONG ; if ( arrayDim > 0 ) convertToArrayType ( parameterTypes , parameterTypesCounter - 1 , arrayDim ) ; arrayDim = 0 ; break ; case 'L' : int indexOfSemiColon = CharOperation . indexOf ( ';' , signature , i + 1 ) ; if ( indexOfSemiColon == - 1 ) throw new ClassFormatException ( ClassFormatException . ErrInvalidMethodSignature ) ; if ( firstIsSynthetic && parameterTypesCounter == 0 ) { firstIsSynthetic = false ; } else { parameterTypes [ parameterTypesCounter ++ ] = replace ( '/' , '.' , CharOperation . subarray ( signature , i + 1 , indexOfSemiColon ) ) ; if ( arrayDim > 0 ) convertToArrayType ( parameterTypes , parameterTypesCounter - 1 , arrayDim ) ; } i = indexOfSemiColon ; arrayDim = 0 ; break ; case 'S' : parameterTypes [ parameterTypesCounter ++ ] = SHORT ; if ( arrayDim > 0 ) convertToArrayType ( parameterTypes , parameterTypesCounter - 1 , arrayDim ) ; arrayDim = 0 ; break ; case 'Z' : parameterTypes [ parameterTypesCounter ++ ] = BOOLEAN ; if ( arrayDim > 0 ) convertToArrayType ( parameterTypes , parameterTypesCounter - 1 , arrayDim ) ; arrayDim = 0 ; break ; case '[' : arrayDim ++ ; break ; default : throw new ClassFormatException ( ClassFormatException . ErrInvalidMethodSignature ) ; } } if ( parameterTypes . length != parameterTypesCounter ) { System . arraycopy ( parameterTypes , 0 , parameterTypes = new char [ parameterTypesCounter ] [ ] , 0 , parameterTypesCounter ) ; } return parameterTypes ; }
for example : - int foo ( string [ ] ) is ( [ ljava / lang / string ; ) i = > java . lang . string [ ] in a char [ ] [ ] - void foo ( int ) is ( i ) v = = > int
