package com.github.yuriyao.FLRMI.FLRMIImpl; import com.github.yuriyao.FLRMI.FLRMIException; import com.github.yuriyao.FLRMI.FLRMISerizableCenter; import com.github.yuriyao.FLRMI.MessageMeta; import com.github.yuriyao.FLRMI.SerizableMessageMeta; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.lang.reflect.Method; /** * 实现一个信元 * * @author fengjing.yfj * */ public class MessageMetaImpl implements MessageMeta { /** 目标对象,对用时代表调用对象,返回时代表返回值对象,或者抛出的异常对象 */ private Object target; /** 方法对象 */ private Method method; /** 参数对象 */ private Object params[]; /** 序列化方法 */ private SerizableMessageMeta serizableMessageMeta; /** 默认的序列化方法列表 */ private static final String[] SE_MESSAGE_METAS = new String[] { "com.github.yuriyao.FLRMI.FLRMIImpl.XMLSerizableMessageMetaImpl", "com.github.yuriyao.FLRMI.FLRMIImpl.SimpleSerizableMessageMetaImpl" }; //加载默认的序列化方法 static { //加载所有的序列化方法 //保证这些序列化方法可以被注册到序列化注册中心 for (String name : SE_MESSAGE_METAS) { try { Class.forName(name); } catch (ClassNotFoundException e) { //忽略异常 } } } /** * 默认的构造函数 */ public MessageMetaImpl() { } /** * 构造函数 * * @param serizableMessageMeta 序列化工具 */ public MessageMetaImpl(SerizableMessageMeta serizableMessageMeta) { this.serizableMessageMeta = serizableMessageMeta; } @Override public void writeExternal(ObjectOutput out) throws IOException { if (this.serizableMessageMeta == null) { this.serizableMessageMeta = SimpleSerizableMessageMetaImpl.create(); } //输出mark out.writeInt(serizableMessageMeta.getMark()); //输出实际的内容 serizableMessageMeta.write(out, this); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { //读取mark Integer mark = in.readInt(); //获取对应的反序列化工具,因为这在从流中读取的时候是没有序列化方法的,需要 //通过序列化方法的注册中心查找对应的序列化工具 this.serizableMessageMeta = FLRMISerizableCenter.getSerizableMessageMeta(mark); if (this.serizableMessageMeta == null) { throw new FLRMIException("无法获取mark为[" + mark.intValue() + "]的反序列化工具, 请手动注册到序列化工具中心[FLRMISerizableCenter]"); } //获取mark对应的 serizableMessageMeta.read(in, this); } @Override public Method getMethod() { return method; } @Override public Object[] getParams() { return params; } @Override public Object getTarget() { return target; } @Override public void setMethod(Method method) { this.method = method; } @Override public void setParams(Object[] objs) { this.params = objs; } @Override public void setTarget(Object target) { this.target = target; } }