Java在加载后重写本机类

Java在加载后重写本机类,java,dynamic-class-loaders,Java,Dynamic Class Loaders,所以我的问题很简单,我有一个插件管理程序,允许在初始程序启动后加载和运行插件。所有这些都很好,我可以根据自己的意愿加载和卸载类,但我现在遇到的问题如下: 我现在正在尝试为插件管理系统编写一个插件,该系统将负责所有网络,以防止每个插件承载自己的连接。问题是我不能使用引导类,因为插件是在运行时动态加载的(我甚至不知道它是否在那里,直到我查找并加载它),但我仍然希望覆盖普通的套接字类来过滤正在发生的事情。我希望使用插件覆盖的其他类也是如此,这样其他尝试使用这些类及其函数的插件将不再能够访问本机实现,而

所以我的问题很简单,我有一个插件管理程序,允许在初始程序启动后加载和运行插件。所有这些都很好,我可以根据自己的意愿加载和卸载类,但我现在遇到的问题如下:

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


所以,很快就把它们放在一起:我需要一种在运行时用我自己的实现动态重写本机类的方法,这样我加载的所有其他东西都将使用我的实现,而不是本机实现。有什么想法吗?

您不应该覆盖
套接字。只需使用
Socket.setSocketFactory
来提供您自己的实现。

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

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

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


然后,您的工厂应该创建
SocketImpl
的子类,该子类可以以自己的方式进行所有联网。

“我的问题非常简单”-“我需要一种方法,在运行时使用自己的实现动态重写本机类”。不错!是的,我正在为正在加载的每个外部.jar创建一个新的URLClassLoader,然后扫描该jar文件以查找主文件,根据加载顺序应用依赖项,然后逐步启用所有插件。网络插件将首先加载,因此在应用更改之前,除了插件管理器本身之外,没有任何东西能够访问套接字,并且在第一次加载所有插件时。我想插座工厂是最好的选择吧?哦,对于其他本机类来说,如果它们不专门为我提供一种方法来改变它们的行为,那么可能就没有办法了?@Pepich1851您需要一定数量的类才能在引导类路径上。您仍然可以从插件访问这些类,但是替换系统类的类需要位于使用单独的URLClassLoader加载的插件之外。