151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 26c0b680f9b6737327f7305dc266e302e594bf70bPrzemyslaw Szczepaniak * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.io; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.lang.reflect.Field; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.reflect.CallerSensitive; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.reflect.Reflection; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.reflect.misc.ReflectUtil; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A description of a Serializable field from a Serializable class. An array 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of ObjectStreamFields is used to declare the Serializable fields of a class. 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Mike Warres 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Roger Riggs 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see ObjectStreamClass 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.2 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class ObjectStreamField 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implements Comparable<Object> 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** field name */ 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final String name; 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** canonical JVM signature of field type */ 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final String signature; 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** field type (Object.class if unknown non-primitive type) */ 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final Class<?> type; 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** whether or not to (de)serialize field values as unshared */ 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final boolean unshared; 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** corresponding reflective field object, if any */ 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final Field field; 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** offset of field value in enclosing field group */ 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private int offset = 0; 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Create a Serializable field with the specified type. This field should 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be documented with a <code>serialField</code> tag. 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name the name of the serializable field 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param type the <code>Class</code> object of the serializable field 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ObjectStreamField(String name, Class<?> type) { 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this(name, type, false); 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an ObjectStreamField representing a serializable field with the 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * given name and type. If unshared is false, values of the represented 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * field are serialized and deserialized in the default manner--if the 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * field is non-primitive, object values are serialized and deserialized as 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * if they had been written and read by calls to writeObject and 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * readObject. If unshared is true, values of the represented field are 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * serialized and deserialized as if they had been written and read by 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calls to writeUnshared and readUnshared. 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name field name 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param type field type 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param unshared if false, write/read field values in the same manner 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as writeObject/readObject; if true, write/read in the same 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manner as writeUnshared/readUnshared 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ObjectStreamField(String name, Class<?> type, boolean unshared) { 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (name == null) { 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.name = name; 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.type = type; 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.unshared = unshared; 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski signature = getClassSignature(type).intern(); 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski field = null; 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an ObjectStreamField representing a field with the given name, 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * signature and unshared setting. 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ObjectStreamField(String name, String signature, boolean unshared) { 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (name == null) { 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException(); 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.name = name; 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.signature = signature.intern(); 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.unshared = unshared; 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski field = null; 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski switch (signature.charAt(0)) { 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 'Z': type = Boolean.TYPE; break; 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 'B': type = Byte.TYPE; break; 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 'C': type = Character.TYPE; break; 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 'S': type = Short.TYPE; break; 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 'I': type = Integer.TYPE; break; 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 'J': type = Long.TYPE; break; 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 'F': type = Float.TYPE; break; 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 'D': type = Double.TYPE; break; 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case 'L': 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case '[': type = Object.class; break; 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski default: throw new IllegalArgumentException("illegal signature"); 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an ObjectStreamField representing the given field with the 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified unshared setting. For compatibility with the behavior of 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * earlier serialization implementations, a "showType" parameter is 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * necessary to govern whether or not a getType() call on this 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ObjectStreamField (if non-primitive) will return Object.class (as 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * opposed to a more specific reference type). 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ObjectStreamField(Field field, boolean unshared, boolean showType) { 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.field = field; 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.unshared = unshared; 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski name = field.getName(); 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Class<?> ftype = field.getType(); 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski type = (showType || ftype.isPrimitive()) ? ftype : Object.class; 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski signature = getClassSignature(ftype).intern(); 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get the name of this field. 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>String</code> representing the name of the serializable 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * field 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getName() { 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return name; 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Get the type of the field. If the type is non-primitive and this 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>ObjectStreamField</code> was obtained from a deserialized {@link 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ObjectStreamClass} instance, then <code>Object.class</code> is returned. 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Otherwise, the <code>Class</code> object for the type of the field is 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returned. 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>Class</code> object representing the type of the 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * serializable field 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @CallerSensitive 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Class<?> getType() { 1655c57c2a7a3f06cc2098fa2d4851cf64dda7b036fPrzemyslaw Szczepaniak /* BEGIN Android-removed: Security manager is always null on Android. 1665c57c2a7a3f06cc2098fa2d4851cf64dda7b036fPrzemyslaw Szczepaniak if (System.getSecurityManager() != null) { 1675c57c2a7a3f06cc2098fa2d4851cf64dda7b036fPrzemyslaw Szczepaniak Class<?> caller = Reflection.getCallerClass(); 1685c57c2a7a3f06cc2098fa2d4851cf64dda7b036fPrzemyslaw Szczepaniak if (ReflectUtil.needsPackageAccessCheck(caller.getClassLoader(), type.getClassLoader())) { 1695c57c2a7a3f06cc2098fa2d4851cf64dda7b036fPrzemyslaw Szczepaniak ReflectUtil.checkPackageAccess(type); 1705c57c2a7a3f06cc2098fa2d4851cf64dda7b036fPrzemyslaw Szczepaniak } 1715c57c2a7a3f06cc2098fa2d4851cf64dda7b036fPrzemyslaw Szczepaniak } 1725c57c2a7a3f06cc2098fa2d4851cf64dda7b036fPrzemyslaw Szczepaniak END Android-removed: Security manager is always null on Android. */ 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return type; 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns character encoding of field type. The encoding is as follows: 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote><pre> 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * B byte 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * C char 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * D double 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * F float 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * I int 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * J long 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * L class or interface 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * S short 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Z boolean 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * [ array 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre></blockquote> 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the typecode of the serializable field 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND: deprecate? 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public char getTypeCode() { 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return signature.charAt(0); 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return the JVM type signature. 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return null if this field has a primitive type. 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND: deprecate? 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getTypeString() { 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return isPrimitive() ? null : signature; 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Offset of field within instance data. 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the offset of this field 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #setOffset 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND: deprecate? 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getOffset() { 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return offset; 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Offset within instance data. 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param offset the offset of the field 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #getOffset 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND: deprecate? 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void setOffset(int offset) { 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.offset = offset; 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return true if this field has a primitive type. 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true if and only if this field corresponds to a primitive type 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND: deprecate? 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isPrimitive() { 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski char tcode = signature.charAt(0); 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ((tcode != 'L') && (tcode != '[')); 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns boolean value indicating whether or not the serializable field 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * represented by this ObjectStreamField instance is unshared. 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2456c0b680f9b6737327f7305dc266e302e594bf70bPrzemyslaw Szczepaniak * @return {@code true} if this field is unshared 2466c0b680f9b6737327f7305dc266e302e594bf70bPrzemyslaw Szczepaniak * 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isUnshared() { 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return unshared; 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compare this field with another <code>ObjectStreamField</code>. Return 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * -1 if this is smaller, 0 if equal, 1 if greater. Types that are 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * primitives are "smaller" than object types. If equal, the field names 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * are compared. 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // REMIND: deprecate? 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int compareTo(Object obj) { 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ObjectStreamField other = (ObjectStreamField) obj; 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean isPrim = isPrimitive(); 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (isPrim != other.isPrimitive()) { 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return isPrim ? -1 : 1; 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return name.compareTo(other.name); 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Return a string that describes this field. 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return signature + ' ' + name; 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns field represented by this ObjectStreamField, or null if 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ObjectStreamField is not associated with an actual field. 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Field getField() { 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return field; 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns JVM type signature of field (similar to getTypeString, except 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that signature strings are returned for primitive fields as well). 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String getSignature() { 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return signature; 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns JVM type signature for given class. 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static String getClassSignature(Class<?> cl) { 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski StringBuilder sbuf = new StringBuilder(); 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (cl.isArray()) { 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('['); 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cl = cl.getComponentType(); 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cl.isPrimitive()) { 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cl == Integer.TYPE) { 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('I'); 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (cl == Byte.TYPE) { 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('B'); 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (cl == Long.TYPE) { 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('J'); 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (cl == Float.TYPE) { 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('F'); 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (cl == Double.TYPE) { 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('D'); 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (cl == Short.TYPE) { 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('S'); 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (cl == Character.TYPE) { 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('C'); 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (cl == Boolean.TYPE) { 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('Z'); 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else if (cl == Void.TYPE) { 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('V'); 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new InternalError(); 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sbuf.append('L' + cl.getName().replace('.', '/') + ';'); 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sbuf.toString(); 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 329