public OJField getCopy() {
    /*if (isAlterable())  return substance.getCopy();*/
    /** **************** */
    // return (FieldDeclaration) substance.clone () ;
    try {

      if (substance instanceof OJFieldByteCode) {
        java.lang.reflect.Field field = ((OJFieldByteCode) substance).getByteCode();
        OJField result = (OJField) this.clone();
        // On remplace du ByteCode par du SourceCode
        FieldDeclaration fd =
            new FieldDeclaration(
                new ModifierList(field.getModifiers()),
                TypeName.forOJClass(OJClass.forClass(field.getDeclaringClass())),
                field.getName(),
                null);
        Environment env = substance.getDeclaringClass().getEnvironment();
        result.substance = new OJFieldSourceCode(env, substance.getDeclaringClass(), fd);
        return result;
      } else if (substance instanceof OJFieldSourceCode) {
        OJField result = (OJField) this.clone();
        result.substance =
            new OJFieldSourceCode(
                ((OJFieldSourceCode) this.substance).getEnvironment(),
                this.substance.getDeclaringClass(),
                (FieldDeclaration) this.substance.getSourceCode().makeRecursiveCopy());
        return result;
      }
    } catch (Exception e) {
      System.err.println("Failed to copy " + this + ": " + e);
      e.printStackTrace();
    }
    return null;
  }
 public boolean getBoolean(Object obj) throws IllegalArgumentException, IllegalAccessException {
   return substance.getBoolean(obj);
 }
 public OJModifier getModifiers() {
   return substance.getModifiers();
 }
 public String getName() {
   return substance.getName();
 }
 public final void setType(OJClass type) throws CannotAlterException {
   substance.setType(type);
 }
 public final void setName(String name) throws CannotAlterException {
   substance.setName(name);
 }
 public final Field getByteCode() throws CannotExecuteException {
   return substance.getByteCode();
 }
 public void set(Object obj, Object value)
     throws IllegalArgumentException, IllegalAccessException {
   substance.set(obj, value);
 }
 public void setBoolean(Object obj, boolean z)
     throws IllegalArgumentException, IllegalAccessException {
   substance.setBoolean(obj, z);
 }
 public float getFloat(Object obj) throws IllegalArgumentException, IllegalAccessException {
   return substance.getFloat(obj);
 }
 public double getDouble(Object obj) throws IllegalArgumentException, IllegalAccessException {
   return substance.getDouble(obj);
 }
 public long getLong(Object obj) throws IllegalArgumentException, IllegalAccessException {
   return substance.getLong(obj);
 }
 public short getShort(Object obj) throws IllegalArgumentException, IllegalAccessException {
   return substance.getShort(obj);
 }
 public char getChar(Object obj) throws IllegalArgumentException, IllegalAccessException {
   return substance.getChar(obj);
 }
 public boolean isExecutable() {
   return substance.isExecutable();
 }
 public void setByte(Object obj, byte b) throws IllegalArgumentException, IllegalAccessException {
   substance.setByte(obj, b);
 }
 public boolean isAlterable() {
   return substance.isAlterable();
 }
 public void setChar(Object obj, char c) throws IllegalArgumentException, IllegalAccessException {
   substance.setChar(obj, c);
 }
 public final FieldDeclaration getSourceCode() throws CannotAlterException {
   return substance.getSourceCode();
 }
 public void setShort(Object obj, short s)
     throws IllegalArgumentException, IllegalAccessException {
   substance.setShort(obj, s);
 }
 public void setDeclaringClass(OJClass parent) throws CannotAlterException {
   substance.setDeclaringClass(parent);
 }
 public void setInt(Object obj, int i) throws IllegalArgumentException, IllegalAccessException {
   substance.setInt(obj, i);
 }
 public final void setModifiers(int mods) throws CannotAlterException {
   substance.setModifiers(mods);
 }
 public void setLong(Object obj, long l) throws IllegalArgumentException, IllegalAccessException {
   substance.setLong(obj, l);
 }
 public OJClass getDeclaringClass() {
   return substance.getDeclaringClass();
 }
 public void setFloat(Object obj, float f)
     throws IllegalArgumentException, IllegalAccessException {
   substance.setFloat(obj, f);
 }
 public String getIdentifiableName() {
   return substance.getIdentifiableName();
 }
 public void setDouble(Object obj, double d)
     throws IllegalArgumentException, IllegalAccessException {
   substance.setDouble(obj, d);
 }
 public OJClass getType() {
   return substance.getType();
 }
 public String toString() {
   return substance.toString();
 }