2014-11-17 48 views
0

我已經使用其中作爲我想和該方法確定根據在物體上的數據類型的我可以釘在儘可能多的參數的系統,該方法是骨架如下:蹣跚與動態參數,傳遞對象[]到對象

public void sendPacket(int id, Object... data) { 
    .... 
} 

這讓我能夠輕鬆地與各種信息發送數據包,通過只提供了ID,然後將數據的順序,我想它在網絡上發送。

這成爲一個問題,當我需要動態調用sendPacket(Integer, Object);

通常我知道我到底有多少數據需要傳遞給了sendpacket方法,和我手動傳遞,但是在這種情況下,我不知道我將發送多少個參數,因此我通過網絡發送的數據量是未知的。

我曾經嘗試這樣做的方法是創建一個Object[] buffer這是不是做什麼,我想它,下面的例子:

Object[] buffer = new Object[list.size() * 3]; 
int bufferIndex = 0; 
for(int i = 0; i < list.size(); i++) { 
    buffer[bufferIndex++] = list.get(i).getId(); 
    buffer[bufferIndex++] = list.get(i).getName(); 
    buffer[bufferIndex++] = list.get(i).getLevel(); 
} 
sendPacket(5, true, list.size(), buffer); 

這提供了以下[DEBUG]輸出。

[DEBUG]: Packet ID: 5 Data Passed[Boolean]: true 
[DEBUG]: Packet ID: 5 Data Passed[Integer]: 1 
[Ljava.lang.Object; 

的[Ljava.lang.Object輸出是因爲我把它安裝到告訴我,沒有轉化成有用的數據對象的類名。

下面是一個例子,以我目前如何解釋被傳遞到了sendpacket

for(Object o : data) { 
    if(o.getClass().getName().endsWith("Integer")) { 
     out.writeInt((int)o); 
    } 
} 

數據有可能更有效的方法來找出哪些類型的數據轉換爲,因此,如果您知道的,這些信息對我自己也有好處。

感謝您的任何幫助。

+0

如何創建保存對象類型信息的不同類以及實際對象。然後,您可以使用類型信息將緩衝區對象轉換爲特定的類型。 – working

回答

0
public class ConvertUtil { 
    private ConvertUtil() {} 

    private final static Map<Class<?>, Method> METHOD_MAP = new HashMap<Class<?>, Method>(); 
    private static Logger      log  = LoggerFactory.getLogger(ConvertUtil.class); 

    static { 
     try { 
      METHOD_MAP.put(Byte.class, Byte.class.getMethod("valueOf", String.class)); 
      METHOD_MAP.put(Short.class, Short.class.getMethod("valueOf", String.class)); 
      METHOD_MAP.put(Integer.class, Integer.class.getMethod("valueOf", String.class)); 
      METHOD_MAP.put(Long.class, Long.class.getMethod("valueOf", String.class)); 
      METHOD_MAP.put(Boolean.class, Boolean.class.getMethod("valueOf", String.class)); 
      METHOD_MAP.put(Float.class, Float.class.getMethod("valueOf", String.class)); 
      METHOD_MAP.put(Double.class, Double.class.getMethod("valueOf", String.class)); 
      METHOD_MAP.put(String.class, String.class.getMethod("valueOf", Object.class)); 
     } catch (Exception e) { 
      log.error("ConvertUtil static is error" + e.getLocalizedMessage()); 
     } 
    } 



    @SuppressWarnings("unchecked") 
    public static <T> T castValue(Object val, T defaultVal) { 
     Method method = METHOD_MAP.get(defaultVal.getClass()); 
     try { 
      if (val != null && val instanceof String) { 
       defaultVal = (T) method.invoke(defaultVal.getClass(), val.toString()); 
      } 
      if (val != null && val.getClass().getName().equals(defaultVal.getClass().getName())) { 
       defaultVal = (T) val; 
      } 
     } catch (Exception e) { 
      log.error("ConvertUtil castValue is error" + e.getLocalizedMessage()); 
     } 
     return defaultVal; 
    } 

} 
+0

好吧,老實說這傷害了我的頭,我明白它的大部分功能,但我並沒有完全理解它。這是否會解決問題與'對象[]'(如果是這樣,如何),或者這只是一個不同的方式來處理'對象'的類 - 此外,我究竟該怎麼稱呼它呢? '公共靜態castValue(object,object)' – Hobbyist