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

📄 dynamicproxyconverter.java

📁 xstream是一个把java object序列化成xml文件的开源库,轻便好用
💻 JAVA
字号:
package com.thoughtworks.xstream.converters.extended;import com.thoughtworks.xstream.converters.ConversionException;import com.thoughtworks.xstream.converters.Converter;import com.thoughtworks.xstream.converters.MarshallingContext;import com.thoughtworks.xstream.converters.UnmarshallingContext;import com.thoughtworks.xstream.io.HierarchicalStreamReader;import com.thoughtworks.xstream.io.HierarchicalStreamWriter;import com.thoughtworks.xstream.mapper.DynamicProxyMapper;import com.thoughtworks.xstream.mapper.Mapper;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.List;/** * Converts a dynamic proxy to XML, storing the implemented * interfaces and handler. * * @author Joe Walnes */public class DynamicProxyConverter implements Converter {    private ClassLoader classLoader;    private Mapper mapper;    public DynamicProxyConverter(Mapper mapper) {        this(mapper, DynamicProxyConverter.class.getClassLoader());    }    public DynamicProxyConverter(Mapper mapper, ClassLoader classLoader) {        this.classLoader = classLoader;        this.mapper = mapper;    }    public boolean canConvert(Class type) {        return type.equals(DynamicProxyMapper.DynamicProxy.class) || Proxy.isProxyClass(type);    }    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {        InvocationHandler invocationHandler = Proxy.getInvocationHandler(source);        addInterfacesToXml(source, writer);        writer.startNode("handler");        writer.addAttribute("class", mapper.serializedClass(invocationHandler.getClass()));        context.convertAnother(invocationHandler);        writer.endNode();    }    private void addInterfacesToXml(Object source, HierarchicalStreamWriter writer) {        Class[] interfaces = source.getClass().getInterfaces();        for (int i = 0; i < interfaces.length; i++) {            Class currentInterface = interfaces[i];            writer.startNode("interface");            writer.setValue(mapper.serializedClass(currentInterface));            writer.endNode();        }    }    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {        List interfaces = new ArrayList();        InvocationHandler handler = null;        while (reader.hasMoreChildren()) {            reader.moveDown();            String elementName = reader.getNodeName();            if (elementName.equals("interface")) {                interfaces.add(mapper.realClass(reader.getValue()));            } else if (elementName.equals("handler")) {                Class handlerType = mapper.realClass(reader.getAttribute("class"));                handler = (InvocationHandler) context.convertAnother(null, handlerType);            }            reader.moveUp();        }        if (handler == null) {            throw new ConversionException("No InvocationHandler specified for dynamic proxy");        }        Class[] interfacesAsArray = new Class[interfaces.size()];        interfaces.toArray(interfacesAsArray);        return Proxy.newProxyInstance(classLoader, interfacesAsArray, handler);    }}

⌨️ 快捷键说明

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