|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
package com.sun.org.apache.bcel.internal.generic; |
|
|
|
import java.util.ArrayList; |
|
import java.util.List; |
|
|
|
import com.sun.org.apache.bcel.internal.Const; |
|
import com.sun.org.apache.bcel.internal.classfile.AnnotationEntry; |
|
import com.sun.org.apache.bcel.internal.classfile.Annotations; |
|
import com.sun.org.apache.bcel.internal.classfile.Attribute; |
|
import com.sun.org.apache.bcel.internal.classfile.Constant; |
|
import com.sun.org.apache.bcel.internal.classfile.ConstantObject; |
|
import com.sun.org.apache.bcel.internal.classfile.ConstantPool; |
|
import com.sun.org.apache.bcel.internal.classfile.ConstantValue; |
|
import com.sun.org.apache.bcel.internal.classfile.Field; |
|
import com.sun.org.apache.bcel.internal.classfile.Utility; |
|
import com.sun.org.apache.bcel.internal.util.BCELComparator; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class FieldGen extends FieldGenOrMethodGen { |
|
|
|
private Object value = null; |
|
private static BCELComparator bcelComparator = new BCELComparator() { |
|
|
|
@Override |
|
public boolean equals(final Object o1, final Object o2) { |
|
final FieldGen THIS = (FieldGen) o1; |
|
final FieldGen THAT = (FieldGen) o2; |
|
return THIS.getName().equals(THAT.getName()) |
|
&& THIS.getSignature().equals(THAT.getSignature()); |
|
} |
|
|
|
@Override |
|
public int hashCode(final Object o) { |
|
final FieldGen THIS = (FieldGen) o; |
|
return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public FieldGen(final int access_flags, final Type type, final String name, final ConstantPoolGen cp) { |
|
super(access_flags); |
|
setType(type); |
|
setName(name); |
|
setConstantPool(cp); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public FieldGen(final Field field, final ConstantPoolGen cp) { |
|
this(field.getAccessFlags(), Type.getType(field.getSignature()), field.getName(), cp); |
|
final Attribute[] attrs = field.getAttributes(); |
|
for (final Attribute attr : attrs) { |
|
if (attr instanceof ConstantValue) { |
|
setValue(((ConstantValue) attr).getConstantValueIndex()); |
|
} else if (attr instanceof Annotations) { |
|
final Annotations runtimeAnnotations = (Annotations) attr; |
|
final AnnotationEntry[] annotationEntries = runtimeAnnotations.getAnnotationEntries(); |
|
for (final AnnotationEntry element : annotationEntries) { |
|
addAnnotationEntry(new AnnotationEntryGen(element, cp, false)); |
|
} |
|
} else { |
|
addAttribute(attr); |
|
} |
|
} |
|
} |
|
|
|
private void setValue(final int index) { |
|
final ConstantPool cp = super.getConstantPool().getConstantPool(); |
|
final Constant c = cp.getConstant(index); |
|
value = ((ConstantObject) c).getConstantValue(cp); |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
public void setInitValue(final String str) { |
|
checkType(ObjectType.getInstance("java.lang.String")); |
|
if (str != null) { |
|
value = str; |
|
} |
|
} |
|
|
|
public void setInitValue(final long l) { |
|
checkType(Type.LONG); |
|
if (l != 0L) { |
|
value = l; |
|
} |
|
} |
|
|
|
public void setInitValue(final int i) { |
|
checkType(Type.INT); |
|
if (i != 0) { |
|
value = i; |
|
} |
|
} |
|
|
|
public void setInitValue(final short s) { |
|
checkType(Type.SHORT); |
|
if (s != 0) { |
|
value = (int) s; |
|
} |
|
} |
|
|
|
public void setInitValue(final char c) { |
|
checkType(Type.CHAR); |
|
if (c != 0) { |
|
value = (int) c; |
|
} |
|
} |
|
|
|
public void setInitValue(final byte b) { |
|
checkType(Type.BYTE); |
|
if (b != 0) { |
|
value = (int) b; |
|
} |
|
} |
|
|
|
public void setInitValue(final boolean b) { |
|
checkType(Type.BOOLEAN); |
|
if (b) { |
|
value = 1; |
|
} |
|
} |
|
|
|
public void setInitValue(final float f) { |
|
checkType(Type.FLOAT); |
|
if (f != 0.0) { |
|
value = f; |
|
} |
|
} |
|
|
|
public void setInitValue(final double d) { |
|
checkType(Type.DOUBLE); |
|
if (d != 0.0) { |
|
value = d; |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
public void cancelInitValue() { |
|
value = null; |
|
} |
|
|
|
private void checkType(final Type atype) { |
|
final Type superType = super.getType(); |
|
if (superType == 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 (!superType.equals(atype)) { |
|
throw new ClassGenException("Types are not compatible: " + superType + " vs. " + atype); |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
public Field getField() { |
|
final String signature = getSignature(); |
|
final int name_index = super.getConstantPool().addUtf8(super.getName()); |
|
final int signature_index = super.getConstantPool().addUtf8(signature); |
|
if (value != null) { |
|
checkType(super.getType()); |
|
final int index = addConstant(); |
|
addAttribute(new ConstantValue(super.getConstantPool().addUtf8("ConstantValue"), 2, index, |
|
super.getConstantPool().getConstantPool())); |
|
} |
|
addAnnotationsAsAttribute(super.getConstantPool()); |
|
return new Field(super.getAccessFlags(), name_index, signature_index, getAttributes(), |
|
super.getConstantPool().getConstantPool()); |
|
} |
|
|
|
private void addAnnotationsAsAttribute(final ConstantPoolGen cp) { |
|
final Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp, super.getAnnotationEntries()); |
|
for (final Attribute attr : attrs) { |
|
addAttribute(attr); |
|
} |
|
} |
|
|
|
private int addConstant() { |
|
switch (super.getType().getType()) { |
|
case Const.T_INT: |
|
case Const.T_CHAR: |
|
case Const.T_BYTE: |
|
case Const.T_BOOLEAN: |
|
case Const.T_SHORT: |
|
return super.getConstantPool().addInteger(((Integer) value)); |
|
case Const.T_FLOAT: |
|
return super.getConstantPool().addFloat(((Float) value)); |
|
case Const.T_DOUBLE: |
|
return super.getConstantPool().addDouble(((Double) value)); |
|
case Const.T_LONG: |
|
return super.getConstantPool().addLong(((Long) value)); |
|
case Const.T_REFERENCE: |
|
return super.getConstantPool().addString((String) value); |
|
default: |
|
throw new RuntimeException("Oops: Unhandled : " + super.getType().getType()); |
|
} |
|
} |
|
|
|
@Override |
|
public String getSignature() { |
|
return super.getType().getSignature(); |
|
} |
|
|
|
private List<FieldObserver> observers; |
|
|
|
|
|
|
|
*/ |
|
public void addObserver(final FieldObserver o) { |
|
if (observers == null) { |
|
observers = new ArrayList<>(); |
|
} |
|
observers.add(o); |
|
} |
|
|
|
|
|
|
|
*/ |
|
public void removeObserver(final FieldObserver o) { |
|
if (observers != null) { |
|
observers.remove(o); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public void update() { |
|
if (observers != null) { |
|
for (final FieldObserver observer : observers) { |
|
observer.notify(this); |
|
} |
|
} |
|
} |
|
|
|
public String getInitValue() { |
|
if (value != null) { |
|
return value.toString(); |
|
} |
|
return null; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
@Override |
|
public final String toString() { |
|
String name; |
|
String signature; |
|
String access; |
|
access = Utility.accessToString(super.getAccessFlags()); |
|
access = access.isEmpty() ? "" : (access + " "); |
|
signature = super.getType().toString(); |
|
name = getName(); |
|
final StringBuilder buf = new StringBuilder(32); |
|
buf.append(access).append(signature).append(" ").append(name); |
|
final String value = getInitValue(); |
|
if (value != null) { |
|
buf.append(" = ").append(value); |
|
} |
|
return buf.toString(); |
|
} |
|
|
|
|
|
|
|
*/ |
|
public FieldGen copy(final ConstantPoolGen cp) { |
|
final FieldGen fg = (FieldGen) clone(); |
|
fg.setConstantPool(cp); |
|
return fg; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public static BCELComparator getComparator() { |
|
return bcelComparator; |
|
} |
|
|
|
|
|
|
|
*/ |
|
public static void setComparator(final BCELComparator comparator) { |
|
bcelComparator = comparator; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
@Override |
|
public boolean equals(final Object obj) { |
|
return bcelComparator.equals(this, obj); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
@Override |
|
public int hashCode() { |
|
return bcelComparator.hashCode(this); |
|
} |
|
} |