summaryrefslogtreecommitdiffstats
path: root/libjava/java/lang/reflect/Field.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/lang/reflect/Field.java')
-rw-r--r--libjava/java/lang/reflect/Field.java264
1 files changed, 264 insertions, 0 deletions
diff --git a/libjava/java/lang/reflect/Field.java b/libjava/java/lang/reflect/Field.java
new file mode 100644
index 00000000000..7c7e690926a
--- /dev/null
+++ b/libjava/java/lang/reflect/Field.java
@@ -0,0 +1,264 @@
+/* Copyright (C) 1998, 1999 Cygnus Solutions
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+package java.lang.reflect;
+
+/**
+ * @author Per Bothner <bothner@cygnus.com>
+ * @date September 1998; February 1999.
+ */
+/* Status: Mostly implemented.
+ * However, access checks are not implemented. See natField.cc for
+ * _Jv_CheckFieldAccessibility as well as the missing getCaller.
+ * Note that the idea is to have to compiler convert calls to
+ * setXXX(...) and getXXX(...) to setXXX(CALLER, ...) and getXXX(CALLER, ...),
+ * where CALLER is reference to the class that contains the calls to
+ * setXXX or getXXX. This is easy for the compiler, and replaces
+ * expensive stack and table searching with a constant.
+ */
+
+public final class Field extends AccessibleObject implements Member
+{
+ private Class declaringClass;
+
+ // This is filled in by getName.
+ private String name;
+
+ // Offset in bytes from the start of declaringClass's fields array.
+ private int offset;
+
+ public boolean equals (Object fld)
+ {
+ if (! (fld instanceof Field))
+ return false;
+ Field f = (Field) fld;
+ return declaringClass == f.declaringClass && offset == f.offset;
+ }
+
+ public Class getDeclaringClass ()
+ {
+ return declaringClass;
+ }
+
+ public native String getName ();
+
+ public native Class getType ();
+
+ public native int getModifiers ();
+
+ public int hashCode()
+ {
+ return (declaringClass.hashCode() ^ offset);
+ }
+
+ // The idea is that the compiler will magically translate
+ // fld.getShort(obj) to fld.getShort(THISCLASS, obj).
+ // This makes checking assessiblity more efficient,
+ // since we don't have to do any stack-walking.
+
+ public boolean getBoolean (Object obj)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ return getBoolean(null, obj);
+ }
+ public char getChar (Object obj)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ return getChar(null, obj);
+ }
+
+ public byte getByte (Object obj)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ return getByte(null, obj);
+ }
+
+ public short getShort (Object obj)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ return getShort(null, obj);
+ }
+
+ public int getInt (Object obj)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ return getInt(null, obj);
+ }
+
+ public long getLong (Object obj)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ return getLong(null, obj);
+ }
+
+ public float getFloat (Object obj)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ return getFloat(null, obj);
+ }
+
+ public double getDouble (Object obj)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ return getDouble(null, obj);
+ }
+
+ public Object get (Object obj)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ return get(null, obj);
+ }
+
+ private native boolean getBoolean (Class caller, Object obj)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ private native char getChar (Class caller, Object obj)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ private native byte getByte (Class caller, Object obj)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ private native short getShort (Class caller, Object obj)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ private native int getInt (Class caller, Object obj)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ private native long getLong (Class caller, Object obj)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ private native float getFloat (Class caller, Object obj)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ private native double getDouble (Class caller, Object obj)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public native Object get (Class caller, Object obj)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public void setByte (Object obj, byte b)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ setByte(null, obj, b);
+ }
+
+ public void setShort (Object obj, short s)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ setShort(null, obj, s);
+ }
+
+ public void setInt (Object obj, int i)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ setInt(null, obj, i);
+ }
+
+ public void setLong (Object obj, long l)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ setLong(null, obj, l);
+ }
+
+ public void setFloat (Object obj, float f)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ setFloat(null, obj, f);
+ }
+
+ public void setDouble (Object obj, double d)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ setDouble(null, obj, d);
+ }
+
+ public void setChar (Object obj, char c)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ setChar(null, obj, c);
+ }
+
+ public void setBoolean (Object obj, boolean b)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ setBoolean(null, obj, b);
+ }
+
+ public native void setByte (Class caller, Object obj, byte b)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public native void setShort (Class caller, Object obj, short s)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public native void setInt (Class caller, Object obj, int i)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public native void setLong (Class caller, Object obj, long l)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public native void setFloat (Class caller, Object obj, float f)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public native void setDouble (Class caller, Object obj, double d)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public native void setChar (Class caller, Object obj, char c)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public native void setBoolean (Class caller, Object obj, boolean b)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ private native void set (Class caller, Object obj, Object val, Class type)
+ throws IllegalArgumentException, IllegalAccessException;
+
+ public void set (Object object, Object value)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ set(null, object, value);
+ }
+
+ public void set (Class caller, Object object, Object value)
+ throws IllegalArgumentException, IllegalAccessException
+ {
+ Class type = getType();
+ if (! type.isPrimitive())
+ set(caller, object, value, type);
+ else if (value instanceof Byte)
+ setByte(caller, object, ((Byte) value).byteValue());
+ else if (value instanceof Short)
+ setShort (caller, object, ((Short) value).shortValue());
+ else if (value instanceof Integer)
+ setInt(caller, object, ((Integer) value).intValue());
+ else if (value instanceof Long)
+ setLong(caller, object, ((Long) value).longValue());
+ else if (value instanceof Float)
+ setFloat(caller, object, ((Float) value).floatValue());
+ else if (value instanceof Double)
+ setDouble(caller, object, ((Double) value).doubleValue());
+ else if (value instanceof Character)
+ setChar(caller, object, ((Character) value).charValue());
+ else if (value instanceof Boolean)
+ setBoolean(caller, object, ((Boolean) value).booleanValue());
+ else
+ throw new IllegalArgumentException();
+ }
+
+ public String toString ()
+ {
+ StringBuffer sbuf = new StringBuffer ();
+ int mods = getModifiers();
+ if (mods != 0)
+ Modifier.toString(mods, sbuf);
+ sbuf.append(getType());
+ sbuf.append(' ');
+ sbuf.append(getDeclaringClass());
+ sbuf.append('.');
+ sbuf.append(getName());
+ return sbuf.toString();
+ }
+}
OpenPOWER on IntegriCloud