classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Object serialization and final fields


From: Guilhem Lavaux
Subject: Object serialization and final fields
Date: Thu, 25 Mar 2004 21:19:53 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030630

Hi,

Some people has reported failures in kaffe with applications trying to deserialize objects containing final fields. Apparently it is authorized in the serialization spec but we cannot rely on java.lang.reflect.Field to set them. So our only solution is to bypass the protection in java.lang.reflect.Field by creating new native calls in ObjectStreamField.

I am proposing the following changes for ObjectStreamField. I don't whether it's possible to make a generic change to Field.java so we can call private methods in it using native calls.

Regards,

Guilhem.
Index: java/io/ObjectStreamField.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/io/ObjectStreamField.java,v
retrieving revision 1.14
diff -u -b -B -r1.14 ObjectStreamField.java
--- java/io/ObjectStreamField.java      26 Feb 2004 07:53:15 -0000      1.14
+++ java/io/ObjectStreamField.java      25 Mar 2004 20:19:43 -0000
@@ -38,9 +38,10 @@
 
 package java.io;
 
+import gnu.java.lang.reflect.TypeSignature;
+
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
-import gnu.java.lang.reflect.TypeSignature;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
@@ -64,7 +65,7 @@
   {
     this (field.getName(), field.getType());
     this.field = field;
-    toset = !Modifier.isFinal(field.getModifiers());
+    //toset = !Modifier.isFinal(field.getModifiers());
   }
 
   /**
@@ -353,11 +354,14 @@
     return "ObjectStreamField< " + type + " " + name + " >";
   }
 
+  final private native void setBooleanNative(Object obj, boolean val) 
+    throws IllegalAccessException;
+
   final void setBooleanField(Object obj, boolean val)
   {
     try
       {
-       field.setBoolean(obj, val);
+       setBooleanNative(obj, val);
       }
     catch(IllegalAccessException x)
       {
@@ -365,11 +369,14 @@
       }
   }
   
+  final private native void setByteNative(Object obj, byte val) 
+    throws IllegalAccessException;
+  
   final void setByteField(Object obj, byte val)
   {
     try
       {
-       field.setByte(obj, val);
+       setByteNative(obj, val);
       }
     catch(IllegalAccessException x)
       {
@@ -377,11 +384,14 @@
       }
   }
   
+  final private native void setCharNative(Object obj, char val) 
+    throws IllegalAccessException;
+  
   final void setCharField(Object obj, char val)
   {
     try
       {
-       field.setChar(obj, val);
+       setCharNative(obj, val);
       }
     catch(IllegalAccessException x)
       {
@@ -389,11 +399,14 @@
       }
   }
   
+  final private native void setShortNative(Object obj, short val) 
+    throws IllegalAccessException;
+
   final void setShortField(Object obj, short val)
   {
     try
       {
-       field.setShort(obj, val);
+       setShortNative(obj, val);
       }
     catch(IllegalAccessException x)
       {
@@ -401,11 +414,14 @@
       }
   }
   
+  final private native void setIntNative(Object obj, int val) 
+    throws IllegalAccessException;
+  
   final void setIntField(Object obj, int val)
   {
     try
       {
-       field.setInt(obj, val);
+       setIntNative(obj, val);
       }
     catch(IllegalAccessException x)
       {
@@ -413,11 +429,14 @@
       }
   }
   
+  final private native void setLongNative(Object obj, long val) 
+    throws IllegalAccessException;
+
   final void setLongField(Object obj, long val)
   {
     try
       {
-       field.setLong(obj, val);
+       setLongNative(obj, val);
       }
     catch(IllegalAccessException x)
       {
@@ -425,11 +444,14 @@
       }
   }
   
+  final private native void setFloatNative(Object obj, float val) 
+    throws IllegalAccessException;
+
   final void setFloatField(Object obj, float val)
   {
     try
       {
-       field.setFloat(obj, val);
+       setFloatNative(obj, val);
       }
     catch(IllegalAccessException x)
       {
@@ -437,11 +459,14 @@
       }
   }
   
+  final private native void setDoubleNative(Object obj, double val) 
+    throws IllegalAccessException;
+  
   final void setDoubleField(Object obj, double val)
   {
     try
       {
-       field.setDouble(obj, val);
+       setDoubleNative(obj, val);
       }
     catch(IllegalAccessException x)
       {
@@ -449,11 +474,14 @@
       }
   }
   
+  final private native void setObjectNative(Object obj, Object val) 
+    throws IllegalAccessException;
+  
   final void setObjectField(Object obj, Object val)
   { 
     try
       {
-       field.set(obj, val);
+       setObjectNative(obj, val);
       }
     catch(IllegalAccessException x)
       {

Attachment: pgp1FHnrhT38j.pgp
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]