我有从Java对象(可能有不同类型的对象)进行序列化的数据,我还具有String格式的序列化数据类型的标准类名。 现在,我想要一个通用方法(非通用已经工作),该方法将String格式的类名和字节数组数据传递给它,作为回报,它将返回反序列化的类对象。有点类似于下面的签名
public <T> T convertByteArrayToObject(String className, byte[] data);
例如,如果我通过convertByteArrayToObject("java.lang.String", [65, 66, 67])
;
然后它将“ ABC”作为String对象返回(但自定义类型也应适用)。
谢谢
答案 0 :(得分:2)
考虑一下,您需要一个通用方法-这样它就可以在编译时强制某种类型安全性 ,但是在运行时只有className
;这根本不可能,或者您真的不了解问题。您可以假装它是通用的,例如:
public static <T> T convertByteArrayToObject(String className, byte[] data) throws Exception {
Class<?> clazz = Class.forName(className);
Constructor<?> c = clazz.getConstructor(byte[].class);
return (T) c.newInstance(data);
}
但是这种转换是没有用的,并且您的方法实际上仅返回Object
,因此您可以在调用方中将其分配给您想要的任何内容:
Integer s = convertByteArrayToObject("java.lang.String", new byte[] { 65, 6, 67 });
因此,该可以很好地编译,给您假象以保护类型安全。另一方面,调用方在运行时将会失败;因为它们的字节码内有checkcast
个调用。坚持使用您拥有的所有东西,并进行适当的检查。