陷入动态参数,将Object []传递给Object

时间:2014-11-17 03:28:44

标签: java arrays types

我一直在使用一个系统,我可以根据需要添加任意数量的参数,该方法根据对象确定数据类型,此方法框架如下:

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

这使我能够轻松地发送包含各种信息的数据包,只需提供ID,然后按照我希望通过网络发送的顺序提供数据。

当我需要动态调用sendPacket(Integer, Object);

时,这就成了一个问题

通常我确切地知道需要传递给sendPacket方法的数据量,并且我手动传递它,但是在这种情况下我不知道我要发送多少个参数,因此数据量I通过网络发送是未知的。

我以前尝试这样做的方法是创建一个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输出是因为我设置它来告诉我无法转换为可用数据的Object的类名。

以下是我目前如何解释传递给sendPacket的数据的示例

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

可能有更有效的方法来确定将数据投射到哪种类型,所以如果你知道一种,那么这些信息对我自己也有好处。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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;
    }

}