[Top][All Lists]
[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)
{
pgp1FHnrhT38j.pgp
Description: PGP signature
- Object serialization and final fields,
Guilhem Lavaux <=