我一直在使用一个系统,我可以根据需要添加任意数量的参数,该方法根据对象确定数据类型,此方法框架如下:
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);
}
}
可能有更有效的方法来确定将数据投射到哪种类型,所以如果你知道一种,那么这些信息对我自己也有好处。
感谢您的帮助。
答案 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;
}
}