Hi, On Thu, 2004-03-25 at 21:19, Guilhem Lavaux wrote: > 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.
It is a bit sad that serialization needs a couple of things that clearly
should have been standard reflection methods/options. Sigh.
I like the idea in general.
Couple of comments/questions.
- ChangeLog entry is missing...
> 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());
> }
Either remove this or make it a real comment explaining why we don't
test this anymore.
> /**
> @@ -353,11 +354,14 @@
> return "ObjectStreamField< " + type + " " + name + " >";
> }
>
> + final private native void setBooleanNative(Object obj, boolean val)
> + throws IllegalAccessException;
> +
This and the other setXXXNative methods should be moved to
VMObjectStreamClass. You should also provide sample JNI implementations
for this in native/jni/java-io/java_io_VMObjectStreamClass.c
(Note that VmSystem.c has examples for this. See VMSystem
setIn/Out/Err())
Maybe make them static and also provide the field object?
> final void setBooleanField(Object obj, boolean val)
> {
> try
> {
> - field.setBoolean(obj, val);
> + setBooleanNative(obj, val);
> }
> catch(IllegalAccessException x)
> {
Do we want to use the new method unconditionally or only when the field
is final?
Cheers,
Mark
signature.asc
Description: This is a digitally signed message part
_______________________________________________ Classpath mailing list [EMAIL PROTECTED] http://mail.gnu.org/mailman/listinfo/classpath

