Eva
Java粉絲募集中
  • 簡介
  • 我們的優勢
  • 最新消息
  • 下載與使用
  • 範例與說明
    • Eva Objects >
      • Bean類別定義
      • Entity型別定義
      • Struct型別定義
      • 建立Entity空白物件
      • 建立Entity修改物件
      • 建立Entity條件物件
      • 建立Struct值物件
    • Eva_ORM >
      • ORM程式主體
      • 使用條件物件執行操作
      • 執行更複雜條件的操作.
      • 分頁取回資料
      • 操作JDBC的參數
      • Array Property的操作
      • Collection Property的操作
      • 更複雜的Collection Property
      • 指定表格名稱
      • 新增資料庫Dialect
    • Eva_IOC >
      • IOC程式主體
      • AOP應用
    • Eva_Struct >
      • Struct範例
      • Bit Strcut範例
      • 指標範例
      • 於Eva_ORM中使用
    • Eva_Sort >
      • 依指定Properties排序
      • 部份排序
      • 優先排序部份
    • Eva_Cache >
      • hashing-based cache
      • 非hashing-based cache
  • API列表
  • 技術支援
    • 協助開發
  • 相關書籍

Struct範例.

Eva_Struct提供StructMapper介面供使用者建立Struct物件, 一個Struct物件與一般物件沒什麼不同, 只是它的功能就如同C語言中的Struct指標一般, 任何對該物件的修改都可能影響到該物件底層所使用到的儲存體, 該儲存體可能是ByteBuffer物件或是ByteBuf物件或是byte陣列.

當然Struct物件也可以用於Eva_ORM中, 所有Struct物件的Property, 在資料庫中將以位元陣列的方式儲存.
package com.logntw.eva.struct;

import java.util.Arrays;

import junit.framework.Assert;

import org.junit.Test;

import com.logntw.eva.anno.bean.Dimension;
import com.logntw.eva.anno.struct.Bytes;
import com.logntw.eva.anno.struct.FieldSeq;
import com.logntw.eva.buf.MAByteBuffer;
import com.logntw.eva.buf.monitor.MonitoredBuf;
import com.logntw.eva.struct.defo.DefoStructMappers;

public class StructMKGeneratorTest8
{
  // 2 + 2*2 = 2 + 4 = 6
  @com.logntw.eva.anno.struct.Struct
  public static interface Y
  {
    @FieldSeq(1)
    char getA();
    void setA(char w);  
    
    @FieldSeq(2)
    @Bytes(2)
    @Dimension(2)
    String[] getB();
    void setB(String[] b);
  }

  // 2 + 3 + 3*4 + 2*1*2*4 + 5*2 + 6*2 = 2 + 3 + 12 + 16 + 10 + 12 = 55
  @com.logntw.eva.anno.struct.Struct
  public static interface X
  {
    @FieldSeq(1)
    short getC();
    void setC(short c);
    
    @FieldSeq(2)
    @Bytes(3)
    String getD();
    void setD(String d);
    
    @FieldSeq(3)
    @Dimension(3)
    int[] getE();
    void setE(int[] e);
    
    @FieldSeq(4)
    @Dimension({2,1,2})
    int[][][] getF();
    void setF(int[][][] f);
    
    @FieldSeq(5)
    @Bytes(5)
    @Dimension(2)
    String[] getG();
    void setG(String[] g);
        
    @FieldSeq(6)    
    @Dimension(2)
    void setH(Y[] h);
    Y[] getH();
  }
  
  
  @Test
  public void testStructMKGenerator() throws Exception
  {
    StructMapper<X> g = DefoStructMappers.getMapper(X.class);
    
    Assert.assertEquals(StructUtil.getTotalBytes(X.class),2 + 3 + 12 + 16 + 10 + 12); 
    
    MonitoredBuf buf = MAByteBuffer.Allocate(2 + 3 + 12 + 16 + 10 + 12);
    X x = g.ptr(buf);
    
    Assert.assertEquals(((WithBuffer)x).$maybeModified(), false);
    
    Assert.assertEquals(x.getC(), 0);
    Assert.assertEquals(x.getD(), "\0\0\0");    
    Assert.assertEquals(x.getE().length, 3);
    Assert.assertEquals(x.getF().length, 2);
    Assert.assertEquals(x.getF()[0].length, 1);
    Assert.assertEquals(x.getF()[0][0].length, 2);    
    Assert.assertEquals(x.getG().length, 2);
    Assert.assertEquals(x.getG()[0], "\0\0\0\0\0");
    Assert.assertEquals(x.getG()[1], "\0\0\0\0\0");
    Assert.assertEquals(x.getH().length, 2);
    Assert.assertEquals(x.getH()[0].getA(), 0);        
    Assert.assertEquals(x.getH()[0].getB().length, 2);
    Assert.assertEquals(x.getH()[0].getB()[0], "\0\0");
        
    x.getH()[0].setA((char)0x33);          
    
    int[][][] arr = new int[2][1][2];
    arr[0][0][0] = 10;
    arr[0][0][1] = 20;
    arr[1][0][0] = 30;
    arr[1][0][1] = 40;
    x.setF(arr);        
    x.setG(new String[]{"GHIJ","KLMNO"});
    
    x.getH()[0].setB(new String[]{"34","56"});
    x.getH()[1].setA((char)0x22);
    x.getH()[1].setB(new String[]{"87","09"});
    
    x.setC((short)0x1111);          
    x.setD("WXY");
    x.setE(new int[]{1,3,5});
          
    Assert.assertEquals(buf.GlimpseArray()[0], (byte)0x11);
    Assert.assertEquals(buf.GlimpseArray()[1], (byte)0x11);
    Assert.assertEquals(buf.GlimpseArray()[2], (byte)'W');
    Assert.assertEquals(buf.GlimpseArray()[3], (byte)'X');
    Assert.assertEquals(buf.GlimpseArray()[4], (byte)'Y');
    
    Assert.assertEquals(buf.GlimpseArray()[5], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[6], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[7], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[8], (byte)0x01);
    Assert.assertEquals(buf.GlimpseArray()[9], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[10], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[11], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[12], (byte)0x03);
    Assert.assertEquals(buf.GlimpseArray()[13], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[14], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[15], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[16], (byte)0x05);
    
    
    Assert.assertEquals(buf.GlimpseArray()[17], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[18], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[19], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[20], (byte)0x0A);
    Assert.assertEquals(buf.GlimpseArray()[21], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[22], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[23], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[24], (byte)0x14);
    Assert.assertEquals(buf.GlimpseArray()[25], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[26], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[27], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[28], (byte)0x1E);
    Assert.assertEquals(buf.GlimpseArray()[29], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[30], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[31], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[32], (byte)0x28);
        
    Assert.assertEquals(buf.GlimpseArray()[33], (byte)'G');
    Assert.assertEquals(buf.GlimpseArray()[34], (byte)'H');
    Assert.assertEquals(buf.GlimpseArray()[35], (byte)'I');
    Assert.assertEquals(buf.GlimpseArray()[36], (byte)'J');
    Assert.assertEquals(buf.GlimpseArray()[37], (byte)'\0');
    
    Assert.assertEquals(buf.GlimpseArray()[38], (byte)'K');
    Assert.assertEquals(buf.GlimpseArray()[39], (byte)'L');
    Assert.assertEquals(buf.GlimpseArray()[40], (byte)'M');
    Assert.assertEquals(buf.GlimpseArray()[41], (byte)'N');
    Assert.assertEquals(buf.GlimpseArray()[42], (byte)'O');
    
    Assert.assertEquals(buf.GlimpseArray()[43], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[44], (byte)0x33);
    Assert.assertEquals(buf.GlimpseArray()[45], (byte)'3');
    Assert.assertEquals(buf.GlimpseArray()[46], (byte)'4');
    Assert.assertEquals(buf.GlimpseArray()[47], (byte)'5');
    Assert.assertEquals(buf.GlimpseArray()[48], (byte)'6');
    
    Assert.assertEquals(buf.GlimpseArray()[49], (byte)0x00);
    Assert.assertEquals(buf.GlimpseArray()[50], (byte)0x22);
    Assert.assertEquals(buf.GlimpseArray()[51], (byte)'8');
    Assert.assertEquals(buf.GlimpseArray()[52], (byte)'7');
    Assert.assertEquals(buf.GlimpseArray()[53], (byte)'0');
    Assert.assertEquals(buf.GlimpseArray()[54], (byte)'9');
        
    
    
    Assert.assertEquals(x.getC(), 0x1111);
    Assert.assertEquals(x.getD(), "WXY");    
    Assert.assertTrue(Arrays.equals(x.getE(), new int[]{1,3,5}));
    Assert.assertTrue(Arrays.equals(x.getF()[0][0], new int[]{10,20}));
    Assert.assertTrue(Arrays.equals(x.getF()[1][0], new int[]{30,40}));
    Assert.assertTrue(Arrays.equals(x.getG(), new String[]{"GHIJ\0","KLMNO"}));
    
    Assert.assertEquals(x.getH()[0].getA(), (char)0x33);
    Assert.assertTrue(Arrays.equals(x.getH()[0].getB(), new String[]{"34","56"}));
    Assert.assertEquals(x.getH()[1].getA(), (char)0x22);
    Assert.assertTrue(Arrays.equals(x.getH()[1].getB(), new String[]{"87","09"}));
    
  }
  
  
}
Powered by Create your own unique website with customizable templates.