Java 加载后覆盖原生 类
Java override native classes after loading
所以我的问题很简单,我有一个插件管理程序,允许加载插件,运行 在初始程序启动后。一切正常,我可以根据需要加载和卸载 classes 但我现在遇到的问题如下:
我现在正在尝试为该插件管理系统编写一个插件,它将处理所有网络以防止每个插件都拥有自己的连接。问题是我无法使用 bootstrap classes,因为插件是在 运行 时间动态加载的(我什至不知道它是否存在,直到我寻找它并加载它)但我仍然想覆盖普通套接字 class 来过滤正在发生的事情。我想使用插件覆盖的其他 classes 也是如此,这样其他尝试使用这些 classes 的插件及其功能将不再能够访问本机实现,而是必须去通过我的实施。别问,我有理由:P
所以所有的东西很快就放在一起了:我需要一种方法在 运行 时间用我自己的实现动态覆盖原生 classes,这样我加载的所有其他东西都将使用我的实现本地人的。有什么想法吗?
您不应覆盖 Socket
。只需使用 Socket.setSocketFactory
来提供您自己的实现。
根据动态 class 加载的工作方式,这可能是不可能的(您需要提供更多细节才能确定,但如果它为每个插件使用新的 ClassLoader,则您无法覆盖系统class来自它)
但是对于您的具体问题,即提供您自己的网络套接字实现,有一个更好的解决方案。
您需要实施 java.net.SocketImplFactory
并使用您的工厂实例调用 Socket.setSocketImplFactory
以及 ServerSocket.setSocketFactory
。 (不要问我为什么这两个方法的名字不一样)
然后您的工厂应该创建您的 SocketImpl
的子class,它可以以自己的方式进行所有联网。
所以我的问题很简单,我有一个插件管理程序,允许加载插件,运行 在初始程序启动后。一切正常,我可以根据需要加载和卸载 classes 但我现在遇到的问题如下:
我现在正在尝试为该插件管理系统编写一个插件,它将处理所有网络以防止每个插件都拥有自己的连接。问题是我无法使用 bootstrap classes,因为插件是在 运行 时间动态加载的(我什至不知道它是否存在,直到我寻找它并加载它)但我仍然想覆盖普通套接字 class 来过滤正在发生的事情。我想使用插件覆盖的其他 classes 也是如此,这样其他尝试使用这些 classes 的插件及其功能将不再能够访问本机实现,而是必须去通过我的实施。别问,我有理由:P
所以所有的东西很快就放在一起了:我需要一种方法在 运行 时间用我自己的实现动态覆盖原生 classes,这样我加载的所有其他东西都将使用我的实现本地人的。有什么想法吗?
您不应覆盖 Socket
。只需使用 Socket.setSocketFactory
来提供您自己的实现。
根据动态 class 加载的工作方式,这可能是不可能的(您需要提供更多细节才能确定,但如果它为每个插件使用新的 ClassLoader,则您无法覆盖系统class来自它)
但是对于您的具体问题,即提供您自己的网络套接字实现,有一个更好的解决方案。
您需要实施 java.net.SocketImplFactory
并使用您的工厂实例调用 Socket.setSocketImplFactory
以及 ServerSocket.setSocketFactory
。 (不要问我为什么这两个方法的名字不一样)
然后您的工厂应该创建您的 SocketImpl
的子class,它可以以自己的方式进行所有联网。