我们正在尝试在应用和服务之间建立安全的IPC渠道。为此,我们提供了一个encrypt()
和一个decrypt()
函数,用于通信通道的两端。 encrypt()
函数接受一个任意Java对象,使用json-io
将其转换为一个字节数组,该数组被加密并通过base 64编码转换为String
。 decrypt()
函数应该反其道而行 - 取b64 String
,将其转换为已解密的字节,然后通过json-io
运行以恢复原始对象。
除了decrypt()
函数返回Object
之外,这可能会按预期工作,因为我们不知道将哪种类型的对象传递到encrypt()
函数。我们的期望是我们能够将生成的Object
转换为正确的类型并将其返回给客户端代码。但是,程序失败并带有
java.lang.ClassCastException: java.lang.Object cannot be cast to ...
错误。
有没有办法在Java中解决这个问题?我发现的所有阅读似乎都没有表明,但我不知道这是否仅仅是因为我不知道要问的正确问题,或者Java是否会这样做。 (我的合作者和我都来自C ++背景,这种事情很简单。)
我想到的一个可能的解决方案是为decrypt()
函数提供不同的返回类型, 可以 转换为任意类型,但我会如果有这样的野兽会感到惊讶。
另一个想法是为每种类型的返回对象实现一个单独的decrypt()
函数,但这似乎是一种混乱的方法,并且随着更多类型的添加而变得越来越笨拙。
我应该问一个不同的问题吗?
答案 0 :(得分:1)
您可以将声明的事物作为对象投射到它实际上的任何类或接口,例如
Object o = java.util.Calendar.getInstance().getTime().toString();
// o is declared as an object but is really a String
// this is fine
String s1 = (String) o;
// this is also fine because String implements CharSequence
CharSequence cs = (CharSequence) o;
同样,可以声明一个方法返回 Object ,同时它返回Object的某个特定子类,然后返回可以转换为返回的特定内容。
但是,如果将某个东西 构建为 一个对象,它就无法投射到任何东西;它可能是类似于String 的Object,但它不是String类的对象。
public Object getThing(final Object arg) {
return new Object() {
private String str = arg.toString();
public String getStr() {
return this.str;
}
};
}
这里返回的东西是一个对象(is-a)虽然它已经被无法访问的位扩展(除了通过反射)因为它们不是&# 39; t java.lang.Object的合同的一部分。
围绕这类事情的一种方法是Java Generics。如果你有public Object decrypt(...)
,你可以创建public T decrypt(...)
- 但是你必须实际构建类或接口T
的对象,而泛型完全是另一个主题,太大而无法进入这里。
因此,它取决于decryptObject(...)
方法构建和返回实际的内容,以了解如何投射返回的对象。
要进行静态转换为(SomeClass) o
,你必须已经知道它是什么。
答案 1 :(得分:0)
我发布了这个答案,用我的发现结束循环。
事实证明,问题不在于decrypt()
函数返回的Object
无法转换为正确的类型:真正的问题是提供普通{{1}的测试代码进入Object
函数 - encrypt()
是无法投放到Object
的函数。一旦我设置了ListCertificatesOutputClass
的外部定义,可以在导线的两端使用并将其传递到ListCertificatesOutputClass
,那么encrypt()
的输出会按预期工作。