mirror of
https://github.com/2003scape/deep-c-rsc.git
synced 2024-03-22 05:49:51 -04:00
289 lines
8.0 KiB
Java
289 lines
8.0 KiB
Java
/*
|
|
* @(#) $(JCGO)/goclsp/vm/java/lang/reflect/Field.java --
|
|
* VM specific Java "Field" implementation.
|
|
**
|
|
* Project: JCGO (http://www.ivmaisoft.com/jcgo/)
|
|
* Copyright (C) 2001-2007 Ivan Maidanski <ivmai@ivmaisoft.com>
|
|
* All rights reserved.
|
|
**
|
|
* Class specification origin: GNU Classpath v0.93 vm/reference
|
|
*/
|
|
|
|
/*
|
|
* This is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
**
|
|
* This software is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License (GPL) for more details.
|
|
**
|
|
* Linking this library statically or dynamically with other modules is
|
|
* making a combined work based on this library. Thus, the terms and
|
|
* conditions of the GNU General Public License cover the whole
|
|
* combination.
|
|
**
|
|
* As a special exception, the copyright holders of this library give you
|
|
* permission to link this library with independent modules to produce an
|
|
* executable, regardless of the license terms of these independent
|
|
* modules, and to copy and distribute the resulting executable under
|
|
* terms of your choice, provided that you also meet, for each linked
|
|
* independent module, the terms and conditions of the license of that
|
|
* module. An independent module is a module which is not derived from
|
|
* or based on this library. If you modify this library, you may extend
|
|
* this exception to your version of the library, but you are not
|
|
* obligated to do so. If you do not wish to do so, delete this
|
|
* exception statement from your version.
|
|
*/
|
|
|
|
package java.lang.reflect;
|
|
|
|
import gnu.classpath.VMStackWalker;
|
|
|
|
import gnu.java.lang.reflect.FieldSignatureParser;
|
|
|
|
public final class Field extends AccessibleObject
|
|
implements Member /* hard-coded class name */
|
|
{ /* VM class */
|
|
|
|
private static final int FIELD_MODIFIERS =
|
|
Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED | Modifier.STATIC |
|
|
Modifier.FINAL | Modifier.VOLATILE | Modifier.TRANSIENT;
|
|
|
|
private final Class declaringClass;
|
|
|
|
private final String name;
|
|
|
|
final int slot;
|
|
|
|
final Class type;
|
|
|
|
final int modifiers;
|
|
|
|
final String signature;
|
|
|
|
Field(Class declaringClass, String name, int slot, Class type,
|
|
int modifiers, String signature)
|
|
{ /* used by VM classes only */
|
|
if (declaringClass == null || name == null || type == null)
|
|
throw new NullPointerException();
|
|
this.declaringClass = declaringClass;
|
|
this.name = name;
|
|
this.slot = slot;
|
|
this.type = type;
|
|
this.modifiers = modifiers;
|
|
this.signature = signature;
|
|
}
|
|
|
|
public Class getDeclaringClass()
|
|
{
|
|
if (declaringClass == null) /* hack */
|
|
throw new InternalError();
|
|
return declaringClass;
|
|
}
|
|
|
|
public String getName()
|
|
{
|
|
if (name == null) /* hack */
|
|
throw new InternalError();
|
|
return name;
|
|
}
|
|
|
|
public int getModifiers()
|
|
{
|
|
return VMField.getModifiersInternal(this) & FIELD_MODIFIERS;
|
|
}
|
|
|
|
public boolean isSynthetic()
|
|
{
|
|
return (VMField.getModifiersInternal(this) & Modifier.SYNTHETIC) != 0;
|
|
}
|
|
|
|
public boolean isEnumConstant()
|
|
{
|
|
return (VMField.getModifiersInternal(this) & Modifier.ENUM) != 0;
|
|
}
|
|
|
|
public Class getType()
|
|
{
|
|
return VMField.getType(this);
|
|
}
|
|
|
|
public boolean equals(Object obj)
|
|
{
|
|
if (obj == this)
|
|
return true;
|
|
if (!(obj instanceof Field))
|
|
return false;
|
|
Field field = (Field) obj;
|
|
return getDeclaringClass() == field.getDeclaringClass() &&
|
|
getName().equals(field.getName()) && getType() == field.getType();
|
|
}
|
|
|
|
public int hashCode()
|
|
{
|
|
return getDeclaringClass().getName().hashCode() ^ getName().hashCode();
|
|
}
|
|
|
|
public String toString()
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
int modifiers = getModifiers();
|
|
if (modifiers != 0)
|
|
Modifier.toString(modifiers, sb).append(' ');
|
|
Constructor.appendTypeName(getType(), sb).append(' ');
|
|
sb.append(getDeclaringClass().getName()).append('.');
|
|
sb.append(getName());
|
|
return sb.toString();
|
|
}
|
|
|
|
public String toGenericString()
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
int modifiers = getModifiers();
|
|
if (modifiers != 0)
|
|
Modifier.toString(modifiers, sb).append(' ');
|
|
sb.append(getGenericType()).append(' ');
|
|
sb.append(getDeclaringClass().getName()).append('.');
|
|
sb.append(getName());
|
|
return sb.toString();
|
|
}
|
|
|
|
public Object get(Object obj)
|
|
throws IllegalAccessException
|
|
{
|
|
return VMField.get(this, obj, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public boolean getBoolean(Object obj)
|
|
throws IllegalAccessException
|
|
{
|
|
return VMField.getBoolean(this, obj, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public byte getByte(Object obj)
|
|
throws IllegalAccessException
|
|
{
|
|
return VMField.getByte(this, obj, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public char getChar(Object obj)
|
|
throws IllegalAccessException
|
|
{
|
|
return VMField.getChar(this, obj, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public short getShort(Object obj)
|
|
throws IllegalAccessException
|
|
{
|
|
return VMField.getShort(this, obj, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public int getInt(Object obj)
|
|
throws IllegalAccessException
|
|
{
|
|
return VMField.getInt(this, obj, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public long getLong(Object obj)
|
|
throws IllegalAccessException
|
|
{
|
|
return VMField.getLong(this, obj, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public float getFloat(Object obj)
|
|
throws IllegalAccessException
|
|
{
|
|
return VMField.getFloat(this, obj, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public double getDouble(Object obj)
|
|
throws IllegalAccessException
|
|
{
|
|
return VMField.getDouble(this, obj, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public void set(Object obj, Object value)
|
|
throws IllegalAccessException
|
|
{
|
|
VMField.set(this, obj, value, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public void setBoolean(Object obj, boolean value)
|
|
throws IllegalAccessException
|
|
{
|
|
VMField.setBoolean(this, obj, value, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public void setByte(Object obj, byte value)
|
|
throws IllegalAccessException
|
|
{
|
|
VMField.setByte(this, obj, value, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public void setChar(Object obj, char value)
|
|
throws IllegalAccessException
|
|
{
|
|
VMField.setChar(this, obj, value, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public void setShort(Object obj, short value)
|
|
throws IllegalAccessException
|
|
{
|
|
VMField.setShort(this, obj, value, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public void setInt(Object obj, int value)
|
|
throws IllegalAccessException
|
|
{
|
|
VMField.setInt(this, obj, value, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public void setLong(Object obj, long value)
|
|
throws IllegalAccessException
|
|
{
|
|
VMField.setLong(this, obj, value, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public void setFloat(Object obj, float value)
|
|
throws IllegalAccessException
|
|
{
|
|
VMField.setFloat(this, obj, value, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public void setDouble(Object obj, double value)
|
|
throws IllegalAccessException
|
|
{
|
|
VMField.setDouble(this, obj, value, isAccessible() ? getDeclaringClass() :
|
|
VMStackWalker.getCallingClass());
|
|
}
|
|
|
|
public Type getGenericType()
|
|
{
|
|
String signature = VMField.getSignature(this);
|
|
if (signature == null)
|
|
return getType();
|
|
return (new FieldSignatureParser(getDeclaringClass(),
|
|
signature)).getFieldType();
|
|
}
|
|
}
|