1 cananian 1.1.4.1 // HFieldProxy.java, created Tue Jan 11 08:14:00 2000 by cananian 2 cananian 1.1.4.2 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.4.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.4.1 package harpoon.ClassFile; 5 cananian 1.1.4.1 6 cananian 1.1.4.1 /** 7 cananian 1.1.4.1 * An <code>HFieldProxy</code> is a relinkable proxy for an 8 cananian 1.1.4.1 * <code>HField</code>. 9 cananian 1.1.4.1 * 10 cananian 1.1.4.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 11 cananian 1.3 * @version $Id: HFieldProxy.java,v 1.3 2003/03/18 02:27:02 cananian Exp $ 12 cananian 1.1.4.1 * @see HField 13 cananian 1.1.4.1 */ 14 cananian 1.1.4.3 class HFieldProxy extends HMemberProxy 15 cananian 1.1.4.3 implements HField, HFieldMutator, java.io.Serializable { 16 cananian 1.1.4.1 HField proxy; 17 cananian 1.1.4.1 HFieldMutator proxyMutator; 18 cananian 1.1.4.1 19 cananian 1.1.4.1 /** Creates a <code>HFieldProxy</code>. */ 20 cananian 1.1.4.1 HFieldProxy(Relinker relinker, HField proxy) { 21 cananian 1.1.4.5 super(relinker, proxy, HFieldImpl.hashCode(proxy)); 22 cananian 1.1.4.1 relink(proxy); 23 cananian 1.1.4.1 } 24 cananian 1.1.4.1 void relink(HField proxy) { 25 cananian 1.1.4.1 super.relink(proxy); 26 cananian 1.1.4.1 this.proxy = proxy; 27 cananian 1.1.4.1 this.proxyMutator = (proxy==null) ? null : proxy.getMutator(); 28 cananian 1.1.4.1 } 29 cananian 1.1.4.1 30 cananian 1.1.4.1 public HFieldMutator getMutator() { 31 cananian 1.1.4.1 if (proxyMutator==null) 32 cananian 1.1.4.1 ((HClassProxy)getDeclaringClass()).getMutator(); 33 cananian 1.1.4.1 return (proxyMutator==null) ? null : this; 34 cananian 1.1.4.1 } 35 cananian 1.1.4.1 // HField interface 36 cananian 1.1.4.1 public HClass getType() { return wrap(proxy.getType()); } 37 cananian 1.1.4.1 public Object getConstant() { return proxy.getConstant(); } 38 cananian 1.1.4.1 public boolean isConstant() { return proxy.isConstant(); } 39 cananian 1.1.4.1 public boolean isStatic() { return proxy.isStatic(); } 40 cananian 1.1.4.4 public String toString() { return HFieldImpl.toString(this); } 41 cananian 1.1.4.4 public boolean equals(Object obj) { return HFieldImpl.equals(this, obj); } 42 cananian 1.3 public HType getGenericType() { 43 cananian 1.3 // xxx need to be able to wrap generic types. 44 cananian 1.3 throw new RuntimeException("Unimplemented"); 45 cananian 1.3 } 46 cananian 1.1.4.1 // HFieldMutator interface 47 cananian 1.1.4.6 // BE CAREFUL TO KEEP TRACK OF PROXY'S HASHCODE CHANGES. 48 cananian 1.1.4.6 // flushMemberMap() and updateMemberMap() need to be called whenever the 49 cananian 1.1.4.6 // underlying proxy's hashcode changes. Things that may cause a 50 cananian 1.1.4.6 // change: changing declaring class, name, or descriptor. 51 cananian 1.1.4.1 public void addModifiers(int m) { proxyMutator.addModifiers(m); } 52 cananian 1.1.4.1 public void setModifiers(int m) { proxyMutator.setModifiers(m); } 53 cananian 1.1.4.1 public void removeModifiers(int m) { proxyMutator.removeModifiers(m); } 54 cananian 1.1.4.1 public void setConstant(Object co) { proxyMutator.setConstant(co); } 55 cananian 1.1.4.1 public void setSynthetic(boolean is) { proxyMutator.setSynthetic(is); } 56 cananian 1.1.4.6 public void setType(HClass type) { 57 cananian 1.1.4.6 flushMemberMap(); 58 cananian 1.1.4.6 try { proxyMutator.setType(unwrap(type)); } 59 cananian 1.1.4.6 finally { updateMemberMap(); } 60 cananian 1.1.4.6 } 61 cananian 1.1.4.3 /** Serializable interface. */ 62 cananian 1.1.4.3 public Object writeReplace() { return new HFieldImpl.HFieldStub(this); } 63 cananian 1.2 }