发送未知类的Java对象

时间:2013-02-26 13:15:53

标签: java classnotfoundexception objectoutputstream objectinputstream

搜索了很长时间,但没有找到任何答案:

我有一台服务器而且我有一个客户端。服务器应通过ObjectInputStreamObjectOutputStream接收对象。这已经适用于服务器上已知的任何class。 现在我想发送服务器不知道的Object class。他只知道那个类的接口。这显然失败了......

如何避免ClassNotFoundException?我认为接口是解决方案。我只想访问界面中我知道的函数,但Java仍然希望拥有该类。

谢谢。

3 个答案:

答案 0 :(得分:3)

没有办法。为了能够在对象上执行方法,您需要具有该对象的具体类的字节代码。它的界面还不够。

答案 1 :(得分:0)

只有JVM加载了这个类,JVM中才会存在某些类的对象。可能不是发送未知类型的对象,而是发送一些描述对象的着名数据结构,即HashMap。所以,而不是做:

MySecretClass o = new MySecretClass ();
o.setFoo ("Hello, World!");
o.setBar (123);
send (o);

您执行以下操作:

Map o = new HashMap ();
o.put ("foo", "Hello, World!");
o.put ("bar", 123);
send (o);

答案 2 :(得分:0)

你需要服务器上的特定类'字节码,所以它不会像你想象的那样工作。

您可以发送客户端和服务器都知道的类的代理对象。代理将包含服务器未知的类的对象,其类将作为字节数组存储在代理中。代理类将是 Externalizable ,并且当反序列化代理对象时,将使用 Classloader.defineClass 在服务器JVM中动态创建未知类(使用具有类定义的字节数组)从客户端传递)。它不会非常快,但可以进行优化,例如不要发送和加载类的定义两次等。

如果您需要直接在从客户端传递的对象上调用接口特定方法,请使代理实现您的接口并在代理对象(java.lang.reflect.Proxy / InvocationHandler)上使用动态代理模式来传递调用到以前未知类的代理对象。

它相当复杂,但我相信可以这样做。