⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sun14reflectionprovider.java

📁 xstream是一个把java object序列化成xml文件的开源库,轻便好用
💻 JAVA
字号:
package com.thoughtworks.xstream.converters.reflection;import sun.misc.Unsafe;import sun.reflect.ReflectionFactory;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.util.HashMap;import java.util.Map;import java.util.Collections;/** * Instantiates a new object on the Sun 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 Sun code that may not be present on all JVMs. * * @author Joe Walnes * @author Brian Slesinsky */public class Sun14ReflectionProvider extends PureJavaReflectionProvider {    private final ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory();    private Unsafe cachedUnsafe;    private final Map constructorCache = Collections.synchronizedMap(new HashMap());    private Unsafe getUnsafe() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {        if (cachedUnsafe != null) {            return cachedUnsafe;        }        Class objectStreamClass = Class.forName("java.io.ObjectStreamClass$FieldReflector");        Field unsafeField = objectStreamClass.getDeclaredField("unsafe");        unsafeField.setAccessible(true);        cachedUnsafe = (Unsafe) unsafeField.get(null);        return cachedUnsafe;    }    public Object newInstance(Class type) {        try {            Constructor customConstructor = getMungedConstructor(type);            return customConstructor.newInstance(new Object[0]);        } catch (NoSuchMethodException e) {            throw new ObjectAccessException("Cannot construct " + type.getName(), e);        } catch (SecurityException e) {            throw new ObjectAccessException("Cannot construct " + type.getName(), e);        } catch (InstantiationException e) {            throw new ObjectAccessException("Cannot construct " + type.getName(), e);        } catch (IllegalAccessException e) {            throw new ObjectAccessException("Cannot construct " + type.getName(), e);        } catch (IllegalArgumentException e) {            throw new ObjectAccessException("Cannot construct " + type.getName(), e);        } catch (InvocationTargetException e) {            throw new ObjectAccessException("Cannot construct " + type.getName(), e);        }    }    private Constructor getMungedConstructor(Class type) throws NoSuchMethodException {        if (!constructorCache.containsKey(type)) {            Constructor javaLangObjectConstructor = Object.class.getDeclaredConstructor(new Class[0]);            Constructor customConstructor = reflectionFactory.newConstructorForSerialization(type, javaLangObjectConstructor);            constructorCache.put(type, customConstructor);        }        return (Constructor) constructorCache.get(type);    }    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) {        try {            Unsafe unsafe = getUnsafe();            long offset = unsafe.objectFieldOffset(field);            Class type = field.getType();            if (type.isPrimitive()) {                if (type.equals(Integer.TYPE)) {                    unsafe.putInt(object, offset, ((Integer) value).intValue());                } else if (type.equals(Long.TYPE)) {                    unsafe.putLong(object, offset, ((Long) value).longValue());                } else if (type.equals(Short.TYPE)) {                    unsafe.putShort(object, offset, ((Short) value).shortValue());                } else if (type.equals(Character.TYPE)) {                    unsafe.putChar(object, offset, ((Character) value).charValue());                } else if (type.equals(Byte.TYPE)) {                    unsafe.putByte(object, offset, ((Byte) value).byteValue());                } else if (type.equals(Float.TYPE)) {                    unsafe.putFloat(object, offset, ((Float) value).floatValue());                } else if (type.equals(Double.TYPE)) {                    unsafe.putDouble(object, offset, ((Double) value).doubleValue());                } else if (type.equals(Boolean.TYPE)) {                    unsafe.putBoolean(object, offset, ((Boolean) value).booleanValue());                } else {                    throw new ObjectAccessException("Could not set field " +                            object.getClass() + "." + field.getName() +                            ": Unknown type " + type);                }            } else {                unsafe.putObject(object, offset, value);            }        } catch (IllegalArgumentException e) {            throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);        } catch (IllegalAccessException e) {            throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);        } catch (NoSuchFieldException e) {            throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);        } catch (ClassNotFoundException e) {            throw new ObjectAccessException("Could not set field " + object.getClass() + "." + field.getName(), e);        }    }    protected void validateFieldAccess(Field field) {        // (overriden) don't mind final fields.    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -