📄 dynamicproxyconverter.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 + -