/* * Copyright (C) 2008 XStream Committers. * All rights reserved. * * The software in this package is published under the terms of the BSD * style license a copy of which has been included with this distribution in * the LICENSE.txt file. * * Created on 09. January 2008 by Joerg Schaible */ package com.thoughtworks.xstream.converters.reflection; //import org.apache.harmony.misc.accessors.ObjectAccessor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * Instantiates a new object on the Harmony JVM by bypassing the constructor (meaning code in * the constructor will never be executed and parameters do not have to be known). This is the * same method used by the internals of standard Java serialization, but relies on internal Harmony * code. * * Note, this is work in progress. Harmony 5.0M4 crashes instantiating a class derived from * {@link com.thoughtworks.acceptance.objects.StandardObject}, of type * {@link javax.swing.JTable} or {@link java.awt.Font}. Additionally it fails with a NPE processing the * annotations and has a wrong offset dealing with time zone. Same problems apply to 5.0M5. * * @author Jörg Schaible * @author Joe Walnes */ public class HarmonyReflectionProvider extends PureJavaReflectionProvider { // private final static ObjectAccessor objectAccess; // private final static Exception exception; // static { // ObjectAccessor accessor = null; // Exception ex = null; // Method method; // try { // method = ObjectAccessor.class.getDeclaredMethod("getInstance"); // method.setAccessible(true); // accessor = (ObjectAccessor)method.invoke(null, null); // } catch (NoSuchMethodException e) { // ex = e; // } catch (IllegalAccessException e) { // ex = e; // } catch (InvocationTargetException e) { // ex = e; // } // objectAccess = accessor; // exception = ex; // } public HarmonyReflectionProvider() { super(); } public HarmonyReflectionProvider(FieldDictionary dic) { super(dic); } public Object newInstance(Class type) { // if (exception != null) { // throw new ObjectAccessException("Cannot construct " + type.getName(), exception); // } // try { // return objectAccess.newInstance(type); // } catch (SecurityException e) { // throw new ObjectAccessException("Cannot construct " + type.getName(), e); // } catch (IllegalArgumentException e) { // throw new ObjectAccessException("Cannot construct " + type.getName(), e); // } return null; } public void writeField(Object object, String fieldName, Object value, Class definedIn) { write(fieldDictionary.field(object.getClass(), fieldName, definedIn), object, value); } private void write(Field field, Object object, Object value) { // if (exception != null) { // throw new ObjectAccessException("Could not set field " // + object.getClass() // + "." // + field.getName(), exception); // } // try { // long offset = objectAccess.getFieldID(field); // Class type = field.getType(); // if (type.isPrimitive()) { // if (type.equals(Integer.TYPE)) { // objectAccess.setInt(object, offset, ((Integer)value).intValue()); // } else if (type.equals(Long.TYPE)) { // objectAccess.setLong(object, offset, ((Long)value).longValue()); // } else if (type.equals(Short.TYPE)) { // objectAccess.setShort(object, offset, ((Short)value).shortValue()); // } else if (type.equals(Character.TYPE)) { // objectAccess.setChar(object, offset, ((Character)value).charValue()); // } else if (type.equals(Byte.TYPE)) { // objectAccess.setByte(object, offset, ((Byte)value).byteValue()); // } else if (type.equals(Float.TYPE)) { // objectAccess.setFloat(object, offset, ((Float)value).floatValue()); // } else if (type.equals(Double.TYPE)) { // objectAccess.setDouble(object, offset, ((Double)value).doubleValue()); // } else if (type.equals(Boolean.TYPE)) { // objectAccess.setBoolean(object, offset, ((Boolean)value).booleanValue()); // } else { // throw new ObjectAccessException("Could not set field " // + object.getClass() // + "." // + field.getName() // + ": Unknown type " // + type); // } // } else { // objectAccess.setObject(object, offset, value); // } // // } catch (IllegalArgumentException e) { // throw new ObjectAccessException("Could not set field " // + object.getClass() // + "." // + field.getName(), e); // } } protected void validateFieldAccess(Field field) { // (overriden) don't mind final fields. } }