FileDocCategorySizeDatePackage
Type.javaAPI DocGlassfish v2 API20901Thu Mar 02 11:51:14 GMT 2006oracle.toplink.libraries.asm

Type

public class Type extends Object
A Java type. This class can be used to make it easier to manipulate type and method descriptors.
author
Eric Bruneton, Chris Nokleberg

Fields Summary
public static final int
VOID
The sort of the void type. See {@link #getSort getSort}.
public static final int
BOOLEAN
The sort of the boolean type. See {@link #getSort getSort}.
public static final int
CHAR
The sort of the char type. See {@link #getSort getSort}.
public static final int
BYTE
The sort of the byte type. See {@link #getSort getSort}.
public static final int
SHORT
The sort of the short type. See {@link #getSort getSort}.
public static final int
INT
The sort of the int type. See {@link #getSort getSort}.
public static final int
FLOAT
The sort of the float type. See {@link #getSort getSort}.
public static final int
LONG
The sort of the long type. See {@link #getSort getSort}.
public static final int
DOUBLE
The sort of the double type. See {@link #getSort getSort}.
public static final int
ARRAY
The sort of array reference types. See {@link #getSort getSort}.
public static final int
OBJECT
The sort of object reference type. See {@link #getSort getSort}.
public static final Type
VOID_TYPE
The void type.
public static final Type
BOOLEAN_TYPE
The boolean type.
public static final Type
CHAR_TYPE
The char type.
public static final Type
BYTE_TYPE
The byte type.
public static final Type
SHORT_TYPE
The short type.
public static final Type
INT_TYPE
The int type.
public static final Type
FLOAT_TYPE
The float type.
public static final Type
LONG_TYPE
The long type.
public static final Type
DOUBLE_TYPE
The double type.
private final int
sort
The sort of this Java type.
private char[]
buf
A buffer containing the descriptor of this Java type. This field is only used for reference types.
private int
off
The offset of the descriptor of this Java type in {@link #buf buf}. This field is only used for reference types.
private int
len
The length of the descriptor of this Java type.
Constructors Summary
private Type(int sort)
Constructs a primitive type.

param
sort the sort of the primitive type to be constructed.


  // --------------------------------------------------------------------------
  // Constructors
  // --------------------------------------------------------------------------

                    

       
    this.sort = sort;
    this.len = 1;
  
private Type(int sort, char[] buf, int off, int len)
Constructs a reference type.

param
sort the sort of the reference type to be constructed.
param
buf a buffer containing the descriptor of the previous type.
param
off the offset of this descriptor in the previous buffer.
param
len the length of this descriptor.

    this.sort = sort;
    this.buf = buf;
    this.off = off;
    this.len = len;
  
Methods Summary
public booleanequals(java.lang.Object o)
Tests if the given object is equal to this type.

param
o the object to be compared to this type.
return
true if the given object is equal to this type.

    if (this == o) {
      return true;
    }
    if (o == null || !(o instanceof Type)) {
      return false;
    }
    Type t = (Type)o;
    if (sort != t.sort) {
      return false;
    }
    if (sort == Type.OBJECT || sort == Type.ARRAY) {
      if (len != t.len) {
        return false;
      }
      for (int i = off, j = t.off, end = i + len; i < end; i++, j++) {
        if (buf[i] != t.buf[j]) {
          return false;
        }
      }
    }
    return true;
  
public static oracle.toplink.libraries.asm.Type[]getArgumentTypes(java.lang.String methodDescriptor)
Returns the Java types corresponding to the argument types of the given method descriptor.

param
methodDescriptor a method descriptor.
return
the Java types corresponding to the argument types of the given method descriptor.

    char[] buf = methodDescriptor.toCharArray();
    int off = 1;
    int size = 0;
    while (true) {
      char car = buf[off++];
      if (car == ')") {
        break;
      } else if (car == 'L") {
        while (buf[off++] != ';") {
        }
        ++size;
      } else if (car != '[") {
        ++size;
      }
    }
    Type[] args = new Type[size];
    off = 1;
    size = 0;
    while (buf[off] != ')") {
      args[size] = getType(buf, off);
      off += args[size].len;
      size += 1;
    }
    return args;
  
public static oracle.toplink.libraries.asm.Type[]getArgumentTypes(java.lang.reflect.Method method)
Returns the Java types corresponding to the argument types of the given method.

param
method a method.
return
the Java types corresponding to the argument types of the given method.

    Class[] classes = method.getParameterTypes();
    Type[] types = new Type[classes.length];
    for (int i = classes.length - 1; i >= 0; --i) {
      types[i] = getType(classes[i]);
    }
    return types;
  
public java.lang.StringgetClassName()
Returns the name of the class corresponding to this type.

return
the fully qualified name of the class corresponding to this type.

    switch (sort) {
      case VOID:    return "void";
      case BOOLEAN: return "boolean";
      case CHAR:    return "char";
      case BYTE:    return "byte";
      case SHORT:   return "short";
      case INT:     return "int";
      case FLOAT:   return "float";
      case LONG:    return "long";
      case DOUBLE:  return "double";
      case ARRAY:   
        StringBuffer b = new StringBuffer(getElementType().getClassName());
        for (int i = getDimensions(); i > 0; --i) {
          b.append("[]");
        }
        return b.toString();
      //case OBJECT:
      default:      
        return new String(buf, off + 1, len - 2).replace('/", '.");
    }
  
public java.lang.StringgetDescriptor()
Returns the descriptor corresponding to this Java type.

return
the descriptor corresponding to this Java type.

    StringBuffer buf = new StringBuffer();
    getDescriptor(buf);
    return buf.toString();
  
private voidgetDescriptor(java.lang.StringBuffer buf)
Appends the descriptor corresponding to this Java type to the given string buffer.

param
buf the string buffer to which the descriptor must be appended.

    switch (sort) {
      case VOID:    buf.append('V"); return;
      case BOOLEAN: buf.append('Z"); return;
      case CHAR:    buf.append('C"); return;
      case BYTE:    buf.append('B"); return;
      case SHORT:   buf.append('S"); return;
      case INT:     buf.append('I"); return;
      case FLOAT:   buf.append('F"); return;
      case LONG:    buf.append('J"); return;
      case DOUBLE:  buf.append('D"); return;
      //case ARRAY:
      //case OBJECT:
      default:      buf.append(this.buf, off, len);
    }
  
public static java.lang.StringgetDescriptor(java.lang.Class c)
Returns the descriptor corresponding to the given Java type.

param
c an object class, a primitive class or an array class.
return
the descriptor corresponding to the given class.

    StringBuffer buf = new StringBuffer();
    getDescriptor(buf, c);
    return buf.toString();
  
private static voidgetDescriptor(java.lang.StringBuffer buf, java.lang.Class c)
Appends the descriptor of the given class to the given string buffer.

param
buf the string buffer to which the descriptor must be appended.
param
c the class whose descriptor must be computed.

    Class d = c;
    while (true) {
      if (d.isPrimitive()) {
        char car;
        if (d == Integer.TYPE) {
          car = 'I";
        } else if (d == Void.TYPE) {
          car = 'V";
        } else if (d == Boolean.TYPE) {
          car = 'Z";
        } else if (d == Byte.TYPE) {
          car = 'B";
        } else if (d == Character.TYPE) {
          car = 'C";
        } else if (d == Short.TYPE) {
          car = 'S";
        } else if (d == Double.TYPE) {
          car = 'D";
        } else if (d == Float.TYPE) {
          car = 'F";
        } else /*if (d == Long.TYPE)*/ {
          car = 'J";
        }
        buf.append(car);
        return;
      } else if (d.isArray()) {
        buf.append('[");
        d = d.getComponentType();
      } else {
        buf.append('L");
        String name = d.getName();
        int len = name.length();
        for (int i = 0; i < len; ++i) {
          char car = name.charAt(i);
          buf.append(car == '." ? '/" : car);
        }
        buf.append(';");
        return;
      }
    }
  
public intgetDimensions()
Returns the number of dimensions of this array type. This method should only be used for an array type.

return
the number of dimensions of this array type.

    int i = 1;
    while (buf[off + i] == '[") {
      ++i;
    }
    return i;
  
public oracle.toplink.libraries.asm.TypegetElementType()
Returns the type of the elements of this array type. This method should only be used for an array type.

return
Returns the type of the elements of this array type.

    return getType(buf, off + getDimensions());
  
public java.lang.StringgetInternalName()
Returns the internal name of the class corresponding to this object type. The internal name of a class is its fully qualified name, where '.' are replaced by '/'. This method should only be used for an object type.

return
the internal name of the class corresponding to this object type.

    return new String(buf, off + 1, len - 2);
  
public static java.lang.StringgetInternalName(java.lang.Class c)
Returns the internal name of the given class. The internal name of a class is its fully qualified name, where '.' are replaced by '/'.

param
c an object class.
return
the internal name of the given class.

    return c.getName().replace('.", '/");
  
public static java.lang.StringgetMethodDescriptor(oracle.toplink.libraries.asm.Type returnType, oracle.toplink.libraries.asm.Type[] argumentTypes)
Returns the descriptor corresponding to the given argument and return types.

param
returnType the return type of the method.
param
argumentTypes the argument types of the method.
return
the descriptor corresponding to the given argument and return types.

    StringBuffer buf = new StringBuffer();
    buf.append('(");
    for (int i = 0; i < argumentTypes.length; ++i) {
      argumentTypes[i].getDescriptor(buf);
    }
    buf.append(')");
    returnType.getDescriptor(buf);
    return buf.toString();
  
public static java.lang.StringgetMethodDescriptor(java.lang.reflect.Method m)
Returns the descriptor corresponding to the given method.

param
m a {@link Method Method} object.
return
the descriptor of the given method.

    Class[] parameters = m.getParameterTypes();
    StringBuffer buf = new StringBuffer();
    buf.append('(");
    for (int i = 0; i < parameters.length; ++i) {
      getDescriptor(buf, parameters[i]);
    }
    buf.append(')");
    getDescriptor(buf, m.getReturnType());
    return buf.toString();
  
public intgetOpcode(int opcode)
Returns a JVM instruction opcode adapted to this Java type.

param
opcode a JVM instruction opcode. This opcode must be one of ILOAD, ISTORE, IALOAD, IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG, ISHL, ISHR, IUSHR, IAND, IOR, IXOR and IRETURN.
return
an opcode that is similar to the given opcode, but adapted to this Java type. For example, if this type is float and opcode is IRETURN, this method returns FRETURN.

    if (opcode == Constants.IALOAD || opcode == Constants.IASTORE) {
      switch (sort) {
        case BOOLEAN:
        case BYTE:
          return opcode + 5;
        case CHAR:
          return opcode + 6;
        case SHORT:
          return opcode + 7;
        case INT:
          return opcode;
        case FLOAT:
          return opcode + 2;
        case LONG:
          return opcode + 1;
        case DOUBLE:
          return opcode + 3;
        //case ARRAY:
        //case OBJECT:
        default:
          return opcode + 4;
      }
    } else {
      switch (sort) {
        case VOID:
          return opcode + 5;
        case BOOLEAN:
        case CHAR:
        case BYTE:
        case SHORT:
        case INT:
          return opcode;
        case FLOAT:
          return opcode + 2;
        case LONG:
          return opcode + 1;
        case DOUBLE:
          return opcode + 3;
        //case ARRAY:
        //case OBJECT:
        default:
          return opcode + 4;
      }
    }
  
public static oracle.toplink.libraries.asm.TypegetReturnType(java.lang.String methodDescriptor)
Returns the Java type corresponding to the return type of the given method descriptor.

param
methodDescriptor a method descriptor.
return
the Java type corresponding to the return type of the given method descriptor.

    char[] buf = methodDescriptor.toCharArray();
    return getType(buf, methodDescriptor.indexOf(')") + 1);
  
public static oracle.toplink.libraries.asm.TypegetReturnType(java.lang.reflect.Method method)
Returns the Java type corresponding to the return type of the given method.

param
method a method.
return
the Java type corresponding to the return type of the given method.

    return getType(method.getReturnType());
  
public intgetSize()
Returns the size of values of this type.

return
the size of values of this type, i.e., 2 for long and double, and 1 otherwise.

    return (sort == LONG || sort == DOUBLE ? 2 : 1);
  
public intgetSort()
Returns the sort of this Java type.

return
{@link #VOID VOID}, {@link #BOOLEAN BOOLEAN}, {@link #CHAR CHAR}, {@link #BYTE BYTE}, {@link #SHORT SHORT}, {@link #INT INT}, {@link #FLOAT FLOAT}, {@link #LONG LONG}, {@link #DOUBLE DOUBLE}, {@link #ARRAY ARRAY} or {@link #OBJECT OBJECT}.

    return sort;
  
public static oracle.toplink.libraries.asm.TypegetType(java.lang.String typeDescriptor)
Returns the Java type corresponding to the given type descriptor.

param
typeDescriptor a type descriptor.
return
the Java type corresponding to the given type descriptor.

    return getType(typeDescriptor.toCharArray(), 0);
  
public static oracle.toplink.libraries.asm.TypegetType(java.lang.Class c)
Returns the Java type corresponding to the given class.

param
c a class.
return
the Java type corresponding to the given class.

    if (c.isPrimitive()) {
      if (c == Integer.TYPE) {
        return INT_TYPE;
      } else if (c == Void.TYPE) {
        return VOID_TYPE;
      } else if (c == Boolean.TYPE) {
        return BOOLEAN_TYPE;
      } else if (c == Byte.TYPE) {
        return BYTE_TYPE;
      } else if (c == Character.TYPE) {
        return CHAR_TYPE;
      } else if (c == Short.TYPE) {
        return SHORT_TYPE;
      } else if (c == Double.TYPE) {
        return DOUBLE_TYPE;
      } else if (c == Float.TYPE) {
        return FLOAT_TYPE;
      } else /*if (c == Long.TYPE)*/ {
        return LONG_TYPE;
      }
    } else {
      return getType(getDescriptor(c));
    }
  
private static oracle.toplink.libraries.asm.TypegetType(char[] buf, int off)
Returns the Java type corresponding to the given type descriptor.

param
buf a buffer containing a type descriptor.
param
off the offset of this descriptor in the previous buffer.
return
the Java type corresponding to the given type descriptor.

    int len;
    switch (buf[off]) {
      case 'V": return VOID_TYPE;
      case 'Z": return BOOLEAN_TYPE;
      case 'C": return CHAR_TYPE;
      case 'B": return BYTE_TYPE;
      case 'S": return SHORT_TYPE;
      case 'I": return INT_TYPE;
      case 'F": return FLOAT_TYPE;
      case 'J": return LONG_TYPE;
      case 'D": return DOUBLE_TYPE;
      case '[":
        len = 1;
        while (buf[off + len] == '[") {
          ++len;
        }
        if (buf[off + len] == 'L") {
          ++len;
          while (buf[off + len] != ';") {
            ++len;
          }
        }
        return new Type(ARRAY, buf, off, len + 1);
      //case 'L':
      default:
        len = 1;
        while (buf[off + len] != ';") {
          ++len;
        }
        return new Type(OBJECT, buf, off, len + 1);
    }
  
public inthashCode()
Returns a hash code value for this type.

return
a hash code value for this type.

    int hc = 13 * sort;
    if (sort == Type.OBJECT || sort == Type.ARRAY) {
      for (int i = off, end = i + len; i < end; i++) {
        hc = 17 * (hc + buf[i]);
      }
    }
    return hc;
  
public java.lang.StringtoString()
Returns a string representation of this type.

return
the descriptor of this type.

    return getDescriptor();