3

所以我的问题很简单,我有一个插件管理程序,它允许在初始程序启动后加载和运行插件。一切正常,我可以根据需要加载和卸载类,但我现在遇到的问题如下:

我现在正在尝试为该插件管理系统编写一个插件,该插件将负责所有网络,以防止每个插件托管自己的连接。问题是我不能使用引导类,因为插件是在运行时动态加载的(我什至不知道它是否存在,直到我寻找并加载它)但我仍然想覆盖普通的套接字类过滤正在发生的事情。我想使用插件覆盖的其他类也是如此,这样其他尝试使用这些类及其功能的插件将不再能够访问本机实现,而是必须通过我的实现。别问,我有理由:P

所以所有的东西都很快放在一起:我需要一种在运行时用我自己的实现动态覆盖原生类的方法,这样我加载的所有其他东西都将使用我的实现而不是原生的。有任何想法吗?

4

2 回答 2

4

根据动态类加载的工作方式,这可能是不可能的(您需要提供更多详细信息以确保,但如果它为每个插件使用新的 ClassLoader,则不能从中覆盖系统类)

但是对于您的特定问题,即提供您自己的网络套接字实现,有一个更好的解决方案。

您需要实现java.net.SocketImplFactory和调用Socket.setSocketImplFactory,以及ServerSocket.setSocketFactory您的工厂实例。(不要问我为什么这两个方法名字不一样)

然后,您的工厂应该创建您的子类,SocketImpl它可以以自己的方式完成所有网络。

于 2016-01-11T14:26:11.963 回答
1

你不应该覆盖Socket. 只需用于Socket.setSocketFactory提供您自己的实现。

于 2016-01-11T14:25:56.027 回答