FileDocCategorySizeDatePackage
FieldGen.javaAPI DocJava SE 5 API9240Fri Aug 26 14:55:20 BST 2005com.sun.org.apache.bcel.internal.generic

FieldGen

public class FieldGen extends FieldGenOrMethodGen
Template class for building up a field. The only extraordinary thing one can do is to add a constant value attribute to a field (which must of course be compatible with to the declared type).
version
$Id: FieldGen.java,v 1.1.1.1 2001/10/29 20:00:12 jvanzyl Exp $
author
M. Dahm
see
Field

Fields Summary
private Object
value
private ArrayList
observers
Constructors Summary
public FieldGen(int access_flags, Type type, String name, ConstantPoolGen cp)
Declare a field. If it is static (isStatic() == true) and has a basic type like int or String it may have an initial value associated with it as defined by setInitValue().

param
access_flags access qualifiers
param
type field type
param
name field name
param
cp constant pool


                                                      
           
    setAccessFlags(access_flags);
    setType(type);
    setName(name);
    setConstantPool(cp);
  
public FieldGen(Field field, ConstantPoolGen cp)
Instantiate from existing field.

param
field Field object
param
cp constant pool (must contain the same entries as the field's constant pool)

    this(field.getAccessFlags(), Type.getType(field.getSignature()), field.getName(), cp);

    Attribute[] attrs = field.getAttributes();

    for(int i=0; i < attrs.length; i++) {
      if(attrs[i] instanceof ConstantValue)
	setValue(((ConstantValue)attrs[i]).getConstantValueIndex());
      else
	addAttribute(attrs[i]);
    }
  
Methods Summary
private intaddConstant()

    switch(type.getType()) {
    case Constants.T_INT: case Constants.T_CHAR: case Constants.T_BYTE:
    case Constants.T_BOOLEAN: case Constants.T_SHORT:
      return cp.addInteger(((Integer)value).intValue());
      
    case Constants.T_FLOAT:
      return cp.addFloat(((Float)value).floatValue());

    case Constants.T_DOUBLE:
      return cp.addDouble(((Double)value).doubleValue());

    case Constants.T_LONG:
      return cp.addLong(((Long)value).longValue());

    case Constants.T_REFERENCE:
      return cp.addString(((String)value));

    default:
      throw new RuntimeException("Oops: Unhandled : " + type.getType());
    }
  
public voidaddObserver(com.sun.org.apache.bcel.internal.generic.FieldObserver o)
Add observer for this object.

    if(observers == null)
      observers = new ArrayList();

    observers.add(o);
  
public voidcancelInitValue()
Remove any initial value.

    value = null;
  
private voidcheckType(com.sun.org.apache.bcel.internal.generic.Type atype)

    if(type == null)
      throw new ClassGenException("You haven't defined the type of the field yet");
    
    if(!isFinal())
      throw new ClassGenException("Only final fields may have an initial value!");

    if(!type.equals(atype))
      throw new ClassGenException("Types are not compatible: " + type + " vs. " + atype);
  
public com.sun.org.apache.bcel.internal.generic.FieldGencopy(com.sun.org.apache.bcel.internal.generic.ConstantPoolGen cp)

return
deep copy of this field

    FieldGen fg = (FieldGen)clone();

    fg.setConstantPool(cp);
    return fg;
  
public com.sun.org.apache.bcel.internal.classfile.FieldgetField()
Get field object after having set up all necessary values.

    String      signature       = getSignature();
    int         name_index      = cp.addUtf8(name);
    int         signature_index = cp.addUtf8(signature);

    if(value != null) {
      checkType(type);
      int index = addConstant();
      addAttribute(new ConstantValue(cp.addUtf8("ConstantValue"),
				     2, index, cp.getConstantPool()));
    }

    return new Field(access_flags, name_index, signature_index, getAttributes(),
		     cp.getConstantPool());
  
public java.lang.StringgetInitValue()

    if(value != null) {
      return value.toString();
    } else
      return null;
  
public java.lang.StringgetSignature()

 return type.getSignature(); 
public voidremoveObserver(com.sun.org.apache.bcel.internal.generic.FieldObserver o)
Remove observer for this object.

    if(observers != null)
      observers.remove(o);
  
public voidsetInitValue(boolean b)

    checkType(Type.BOOLEAN);

    if(b)
      value = new Integer(1);
  
public voidsetInitValue(float f)

    checkType(Type.FLOAT);

    if(f != 0.0)
      value = new Float(f);
  
public voidsetInitValue(double d)

    checkType(Type.DOUBLE);

    if(d != 0.0)
      value = new Double(d);
  
public voidsetInitValue(java.lang.String str)
Set (optional) initial value of field, otherwise it will be set to null/0/false by the JVM automatically.

    checkType(new ObjectType("java.lang.String"));

    if(str != null)
      value = str;
  
public voidsetInitValue(long l)

    checkType(Type.LONG);

    if(l != 0L)
      value = new Long(l);
  
public voidsetInitValue(int i)

    checkType(Type.INT);

    if(i != 0)
      value = new Integer(i);
  
public voidsetInitValue(short s)

    checkType(Type.SHORT);

    if(s != 0)
      value = new Integer(s);
  
public voidsetInitValue(char c)

    checkType(Type.CHAR);

    if(c != 0)
      value = new Integer(c);
  
public voidsetInitValue(byte b)

    checkType(Type.BYTE);

    if(b != 0)
      value = new Integer(b);
  
private voidsetValue(int index)

    ConstantPool cp  = this.cp.getConstantPool();
    Constant     c   = cp.getConstant(index);
    value = ((ConstantObject)c).getConstantValue(cp);
  
public final java.lang.StringtoString()
Return string representation close to declaration format, `public static final short MAX = 100', e.g..

return
String representation of field

    String name, signature, access; // Short cuts to constant pool

    access    = Utility.accessToString(access_flags);
    access    = access.equals("")? "" : (access + " ");
    signature = type.toString();
    name      = getName();

    StringBuffer buf = new StringBuffer(access + signature + " " + name);
    String value = getInitValue();

    if(value != null)
      buf.append(" = " + value);

    return buf.toString();
  
public voidupdate()
Call notify() method on all observers. This method is not called automatically whenever the state has changed, but has to be called by the user after he has finished editing the object.

    if(observers != null)
      for(Iterator e = observers.iterator(); e.hasNext(); )
	((FieldObserver)e.next()).notify(this);