从c/c++/delphi转过来的朋友肯定很不习惯java ,因为java没有指针,没有结构体!通过内存拷贝之后获得的结构体是多么的方便,特别是在网络传输,但是,对于内存流的命令编写,java简直是僵梦,我在网上找了很多的资料,但是都是需要手工编写转换的,那样很容易出错,也很痛苦,因此,我用java的反射机制实现了一种自动转换的方式。具体思路如下:
1. 声明一个名为Convert的接口,接口有 toByte,fromByte,len三个接口
2. 创建n各类,分别是 Uint8,Uint16,Uint32 UIint64........然后这几个类分别实现这三个接口。8可以用byte,16可以用short,32可以用 int,64可以用long
3,.创建命令头 AbstractCmd,分别也实现Convet的三个接口,接口里面的代码用到映射,把凡事实现过Convert的变量逐步调用相应的convet接口,迭代之后得到相应的数据
4,要注意生命顺序必须和你自己的命令字段一致。
举例 AbstractCmd里面的toByte函数实现:
/** *将实现了Convet接口的变量转换成相应的Byte数组 */ @Override public final byte[] toByte() { ByteArrayOutputStream outputStream=new ByteArrayOutputStream(len()); for (Field f:this.getClass().getDeclaredFields()) { try { if (f.get(this) instanceof Convert){ try { Method method= null; Object o= null; try { o = f.get(this); } catch (IllegalAccessException e) { e.printStackTrace(); } method = o.getClass().getDeclaredMethod("toByte",new Class<?>[0]); if (method!=null){ method.setAccessible(true); try { outputStream.write((byte [])method.invoke(f.get(this))); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } catch (NoSuchMethodException e) { e.printStackTrace(); } } } catch (IllegalAccessException e) { e.printStackTrace(); } } return outputStream.toByteArray(); }
这里只说出实现思路,不写出具体的实现方式。