搜索了很长时间,但没有找到任何答案:
我有一台服务器而且我有一个客户端。服务器应通过ObjectInputStream
和ObjectOutputStream
接收对象。这已经适用于服务器上已知的任何class
。
现在我想发送服务器不知道的Object
class
。他只知道那个类的接口。这显然失败了......
如何避免ClassNotFoundException
?我认为接口是解决方案。我只想访问界面中我知道的函数,但Java仍然希望拥有该类。
谢谢。
答案 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)上使用动态代理模式来传递调用到以前未知类的代理对象。
它相当复杂,但我相信可以这样做。