blob: e5713cf6c98c36cd69cd7e834064d447cbe6e051 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xalan" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 1999, Lotus
* Development Corporation., http://www.lotus.com. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.xml.utils.synthetic.reflection;
import org.apache.xml.utils.synthetic.Class;
import org.apache.xml.utils.synthetic.SynthesisException;
/**
* <meta name="usage" content="internal"/>
* A Field provides information about, and dynamic access
* to, a single field of a class or an interface. The reflected
* field may be a class (static) field or an instance field.
* <p>
* A Field permits widening conversions to occur during a
* get or set access operation, but throws an
* IllegalArgumentException if a narrowing conversion
* would occur.
*
*/
public class Field extends Object implements Member
{
/** Field name, initializer */
public String name, initializer = null;
/** Field modifiers */
int modifiers;
/** Field realfield */
java.lang.reflect.Field realfield = null;
/** Field declaringClass, type */
Class declaringClass, type;
/**
* Proxy constructor
*
* @param realfield
* @param declaringClass
*/
public Field(java.lang.reflect.Field realfield,
org.apache.xml.utils.synthetic.Class declaringClass)
{
this(realfield.getName(), declaringClass);
this.realfield = realfield;
this.type =
org.apache.xml.utils.synthetic.Class.forClass(realfield.getType());
}
/**
* Synthesis constructor
*
* @param name
* @param declaringClass
*/
public Field(String name,
org.apache.xml.utils.synthetic.Class declaringClass)
{
this.name = name;
this.declaringClass = declaringClass;
}
/**
* Compares this Field against the specified object.
* Returns true if the objects are the same. Two
* Fields are the same if they were declared by the
* same class and have the same name and type.
*
* @param obj
*
*/
public boolean equals(Object obj)
{
if (realfield != null)
return realfield.equals(obj);
else if (obj instanceof Field)
{
Field objf = (Field) obj;
return (declaringClass.equals(objf.declaringClass)
&& name.equals(objf.name) && type.equals(objf.type));
}
else
return false;
}
/**
* Returns the value of the field represented by this
* Field, on the specified object. The value is
* automatically wrapped in an object if it has a
* primitive type.
* <p>
* The underlying field's value is obtained as follows:
* <p>
* If the underlying field is a static field, the object
* argument is ignored; it may be null.
* <p>
* Otherwise, the underlying field is an instance
* field. If the specified object argument is null, the
* method throws a NullPointerException. If the
* specified object is not an instance of the class or
* interface declaring the underlying field, the
* method throws an IllegalArgumentException.
* <p>
* If this Field object enforces Java language access
* control, and the underlying field is inaccessible,
* the method throws an IllegalAccessException.
* <p>
* Otherwise, the value is retrieved from the
* underlying instance or static field. If the field has a
* primitive type, the value is wrapped in an object
* before being returned, otherwise it is returned as
* is.
*
*
* @param obj
*
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field.
* @throws NullPointerException
* if the specified object is null.
*/
public Object get(Object obj)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
return realfield.get(obj);
throw new java.lang.IllegalStateException();
}
/**
* Get the value of a field as a boolean on specified
* object.
*
*
* @param obj
*
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the field value cannot be converted to the
* return type by a widening conversion.
*/
public boolean getBoolean(Object obj)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
return realfield.getBoolean(obj);
throw new java.lang.IllegalStateException();
}
/**
* Get the value of a field as a byte on specified
* object.
*
*
* @param obj
*
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the field value cannot be converted to the
* return type by a widening conversion.
*/
public byte getByte(Object obj)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
return realfield.getByte(obj);
throw new java.lang.IllegalStateException();
}
/**
* Get the value of a field as a char on specified
* object.
*
*
* @param obj
*
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the field value cannot be converted to the
* return type by a widening conversion.
*/
public char getChar(Object obj)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
return realfield.getChar(obj);
throw new java.lang.IllegalStateException();
}
/**
* Returns the Class object representing the class or
* interface that declares the field represented by this
* Field object.
*
*/
public org.apache.xml.utils.synthetic.Class getDeclaringClass()
{
if (realfield != null)
return org.apache.xml.utils.synthetic.Class.forClass(
realfield.getDeclaringClass());
throw new java.lang.IllegalStateException();
}
/**
* Get the value of a field as a double on specified
* object.
*
*
* @param obj
*
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the field value cannot be converted to the
* return type by a widening conversion.
*/
public double getDouble(Object obj)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
return realfield.getDouble(obj);
throw new java.lang.IllegalStateException();
}
/**
* Get the value of a field as a float on specified
* object.
*
*
* @param obj
*
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the field value cannot be converted to the
* return type by a widening conversion.
*/
public float getFloat(Object obj)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
return realfield.getFloat(obj);
throw new java.lang.IllegalStateException();
}
/**
* Get the value of a field as a int on specified object.
*
*
* @param obj
*
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the field value cannot be converted to the
* return type by a widening conversion.
*/
public int getInt(Object obj)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
return realfield.getInt(obj);
throw new java.lang.IllegalStateException();
}
/**
* Get the value of a field as a long on specified
* object.
*
*
* @param obj
*
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the field value cannot be converted to the
* return type by a widening conversion.
*/
public long getLong(Object obj)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
return realfield.getLong(obj);
throw new java.lang.IllegalStateException();
}
/**
* Returns the Java language modifiers for the field
* represented by this Field object, as an integer. The
* Modifier class should be used to decode the
* modifiers.
*
*/
public int getModifiers()
{
if (realfield != null)
modifiers = realfield.getModifiers();
return modifiers;
}
/**
* Method getInitializer
*
*
* (getInitializer) @return
*/
public String getInitializer()
{
return initializer;
}
/**
* Method setInitializer
*
*
* @param i
*
* @throws SynthesisException
*/
public void setInitializer(String i) throws SynthesisException
{
if (realfield != null)
throw new SynthesisException(SynthesisException.REIFIED);
initializer = i;
}
/**
* Insert the method's description here.
* Creation date: (12-25-99 2:02:26 PM)
* @return java.lang.String
*/
public java.lang.String getName()
{
return name;
}
/**
* Get the value of a field as a short on specified
* object.
*
*
* @param obj
*
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the field value cannot be converted to the
* return type by a widening conversion.
*/
public short getShort(Object obj)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
return realfield.getShort(obj);
throw new java.lang.IllegalStateException();
}
/**
* Returns a Class object that identifies the declared
* type for the field represented by this Field object.
*
*/
public Class getType()
{
if (realfield != null)
type = Class.forClass(realfield.getType());
return type;
}
/**
* Method setType
*
*
* @param type
*
* @throws SynthesisException
*/
public void setType(org.apache.xml.utils.synthetic.Class type)
throws SynthesisException
{
if (realfield != null)
throw new SynthesisException(SynthesisException.REIFIED);
this.type = type;
}
/**
* Returns a hashcode for this Field. This is
* computed as the exclusive-or of the hashcodes for
* the underlying field's declaring class name and its
* name.
*
*/
public int hashCode()
{
if (realfield != null)
return realfield.hashCode();
else
return declaringClass.getName().hashCode() ^ name.hashCode();
}
/**
* Sets the field represented by this Field object on
* the specified object argument to the specified new
* value. The new value is automatically unwrapped
* if the underlying field has a primitive type.
*
* The operation proceeds as follows:
*
* If the underlying field is static, the object
* argument is ignored; it may be null.
*
* Otherwise the underlying field is an instance field.
* If the specified object argument is null, the
* method throws a NullPointerException. If the
* specified object argument is not an instance of the
* class or interface declaring the underlying field,
* the method throws an IllegalArgumentException.
*
* If this Field object enforces Java language access
* control, and the underlying field is inaccessible,
* the method throws an IllegalAccessException.
*
* If the underlying field is final, the method throws
* an IllegalAccessException.
*
* If the underlying field is of a primitive type, an
* unwrapping conversion is attempted to convert the
* new value to a value of a primitive type. If this
* attempt fails, the method throws an
* IllegalArgumentException.
*
* If, after possible unwrapping, the new value
* cannot be converted to the type of the underlying
* field by an identity or widening conversion, the
* method throws an IllegalArgumentException.
*
* The field is set to the possibly unwrapped and
* widened new value.
*
*
* @param obj
* @param value
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field, or if an unwrapping
* conversion fails.
* @throws NullPointerException
* if the specified object is null.
*/
public void set(Object obj, Object value)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
realfield.set(obj, value);
throw new java.lang.IllegalStateException();
}
/**
* Set the value of a field as a boolean on specified
* object.
*
*
* @param obj
* @param z
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field, or if an unwrapping
* conversion fails.
*/
public void setBoolean(Object obj, boolean z)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
realfield.setBoolean(obj, z);
throw new java.lang.IllegalStateException();
}
/**
* Set the value of a field as a byte on specified
* object.
*
*
* @param obj
* @param b
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field, or if an unwrapping
* conversion fails.
*/
public void setByte(Object obj, byte b)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
realfield.setByte(obj, b);
throw new java.lang.IllegalStateException();
}
/**
* Set the value of a field as a char on specified
* object.
*
*
* @param obj
* @param c
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field, or if an unwrapping
* conversion fails.
*/
public void setChar(Object obj, char c)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
realfield.setChar(obj, c);
throw new java.lang.IllegalStateException();
}
/**
* Returns the Class object representing the class that
* declares the constructor represented by this
* Constructor object.
*
* @param declaringClass
*/
public void setDeclaringClass(
org.apache.xml.utils.synthetic.Class declaringClass)
{
this.declaringClass = declaringClass;
}
/**
* Set the value of a field as a double on specified
* object.
*
*
* @param obj
* @param d
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field, or if an unwrapping
* conversion fails.
*/
public void setDouble(Object obj, double d)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
realfield.setDouble(obj, d);
throw new java.lang.IllegalStateException();
}
/**
* Set the value of a field as a float on specified
* object.
*
*
* @param obj
* @param f
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field, or if an unwrapping
* conversion fails.
*/
public void setFloat(Object obj, float f)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
realfield.setFloat(obj, f);
throw new java.lang.IllegalStateException();
}
/**
* Set the value of a field as an int on specified
* object.
*
*
* @param obj
* @param i
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field, or if an unwrapping
* conversion fails.
*/
public void setInt(Object obj, int i)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
realfield.setInt(obj, i);
throw new java.lang.IllegalStateException();
}
/**
* Set the value of a field as a long on specified
* object.
*
*
* @param obj
* @param l
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field, or if an unwrapping
* conversion fails.
*/
public void setLong(Object obj, long l)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
realfield.setLong(obj, l);
throw new java.lang.IllegalStateException();
}
/**
* Insert the method's description here.
* Creation date: (12-25-99 1:28:28 PM)
* @return int
* @param modifiers int
*
* @throws SynthesisException
*/
public void setModifiers(int modifiers) throws SynthesisException
{
if (realfield != null)
throw new SynthesisException(SynthesisException.REIFIED);
this.modifiers = modifiers;
}
/**
* Set the value of a field as a short on specified
* object.
*
*
* @param obj
* @param s
* @throws IllegalAccessException
* if the underlying constructor is inaccessible.
* @throws IllegalArgumentException
* if the specified object is not an instance of
* the class or interface declaring the
* underlying field, or if an unwrapping
* conversion fails.
*/
public void setShort(Object obj, short s)
throws IllegalArgumentException, IllegalAccessException
{
if (realfield != null)
realfield.setShort(obj, s);
throw new java.lang.IllegalStateException();
}
/**
* Return a string describing this Field. The format is
* the access modifiers for the field, if any, followed
* by the field type, followed by a space, followed by
* the fully-qualified name of the class declaring the
* field, followed by a period, followed by the name
* of the field. For example:
* <code>
* public static final int java.lang.Thread.MIN_PRIORITY
* private int java.io.FileDescriptor.fd
* </code>
*
* The modifiers are placed in canonical order as
* specified by "The Java Language Specification".
* This is public, protected or private first,
* and then other modifiers in the following order:
* static, final, transient, volatile.
*
*/
public String toString()
{
if (realfield != null)
return realfield.toString();
throw new java.lang.IllegalStateException();
}
/**
* Output the Field as Java sourcecode
*
*/
public String toSource()
{
StringBuffer sb = new StringBuffer(
java.lang.reflect.Modifier.toString(getModifiers())).append(' ').append(
getType().getJavaName()).append(' ').append(getName());
String i = getInitializer();
if (i != null && i.length() > 0)
sb.append('=').append(i);
sb.append(';');
return sb.toString();
}
}