在上一篇文章中,我们讨论了SandBox.sh的最后执行。SH是我们熟悉的Java -jar命令,用于拉出Sandbox -core.jar套件。
然后,我们应该查找沙盒核心的入口文件。JarJar软件包,有两种方法可以找到方法:
PS:以上找到模块入口的两种方法对于习惯Springboot的学生可能有些奇怪。实际上,Springboot也这样做。Springboot项目的入口实际上不在我们经常写的@springboot注释下的主要方法中。该方法实际上将反映在实际入口处。有关详细信息,请参阅本文:您真的知道如何了解Springboot应用程序的开始入口?-Uejin.cn
通过上述分析,我们了解到,在SandBox.SH执行Java -Jar之后,他最终将在模块模块下的主要方法中使用Sandbox。
核心逻辑和源代码如下:
corelauncher.java的核心逻辑如上所述,但是为什么在运行时可以在目标JVM期间安装其他JAR软件包呢?
必须说,JVM向开发人员提供的Java工具是“杀手武器”。
最初准备在第三部分解释Java工具的知识,但是这部分有点有点,因此采用了一个解释:[“到补充剂”]
上述过程完成后,当前的启动过程将成为这样:
在第二季度,我讨论了corelauncher.java到sandbox-agent.jar。接下来,让我们看看沙盒代理的入口在哪里。(实际上,沙盒代理很小,在入口处很容易找到)
下面显示了沙盒代理模块模块的pom.xml(仅显示关键信息),premain-class和Agent-class标签指向AgentLauncher类,表明入口在此类中。
前类标签表明,当前的JAR软件包是通过虚拟机参数中指定 - javaagent固定的(启动时安装),并且入口位于AgentLauncher#premain方法中。
Agent-class标签表明当前的JAR软件包是由VirtualMachine#loadAgent方法(在运行时安装)在AgentLauncher#AgentMain方法中安装的。
通常在运行时安装沙箱,因此我们的焦点可以转移到AgentLauncher#agentMain方法中。
代理方法如下所示。加载代理时,特征引起的参数通过方法参数CFG传递。该参数实际上是Sandbox所需的配置文件。
此方法相对简单。分析配置参数后,启动了安装过程。最后,将安装结果附加到sandbox.token文件中。该方法中的另一个逻辑相对简单,只需查看一下即可。我们将下一步分析核心安装方法。
安装方法逻辑在逻辑上更为逻辑。在这里,安装方法是在安装方法的第一个摘要下完成的,并给出了该方法的所有代码。之后,我们将慢慢分析其中的细节。在这里,我们注意通过仪器对象的这种方法。
建立安装方法,以下内容已经完成:
完整的代码如下所示:
安装的初始代码是一些配置分析操作。只要看一下。
让我们首先讨论与ClassLoader相关的代码,以下三行:
将Sandbox-Spy Jar包装注入BootstrapClassloader加载路径。这是沙盒 - spy的角色:我们可以认为该软件包中的代码是塞里斯特·塞里斯特(Seriesthe类别,可以埋在业务代码中的某些信息中,以在业务代码执行过程中获取一些信息。
但是,为什么BootstrapClassloader加载了间谍类?
有理由认为,在业务代码中,仅需要应用程序ClassLoader就足够了。稍后,通过提醒大个子,如果您想增强JDK中的代码,ApplicationClassLoader还不够。ExtensionClassLoader和BootstrapClassLoader。不要破坏母公司佣金机制,这是一种更多的保险方法。
之后,初始化了SandBoxClassLoader。此自定义类加载程序主要负责将类加载到沙箱中。它的实现破坏了父母的委托机制,并可以确保沙箱中的类完全与商业代码类别隔离。
通过上面的两行之后,整个项目的类负载器模型大致如下图所示:
完成SandBoxClassLoader的初始化后,首先加载此类。从类名称中很容易知道知道沙盒的核心配置信息。目的。
TOCONFIGURE方法相对简单,如下所示。它是调用构造函数,然后分析配置。如果您有兴趣,可以看一下。
第二个加载类是,完成类加载后,反映getInstance方法以获取服务器对象。
ProxyCoreserver#getInstance方法如下所示。此方法还反映了称JetTycoreserver#GetInstance方法制度化了JetTyCoreserver。此方法还可以更好地反映ProxyCoreserver的含义。表名称只是代理服务器。特定的实现由ClassOfCoreserverpl指定。
作者在这里应该使Coreserver的实现更加可扩展。如果某些学生不想使用JettyServer,他们想使用自己的服务器。他们只需要实现Coreserver接口并替换ClassOfCoreserverpl。
在获得了Coreserver实例对象后,反射调用JetTycoreserver#isBind方法来确定服务器是否初始化。如果未初始化初始化,则反映了JetTycoreserver#bind bind方法的jettyserver的绑定方法初始化,在其中,在其中,在其中,在其中,在其中,在其中,在其中,在其中,在其中,在其中,在其中,在其中,在其中,在砂箱的初始化中也已完成。JettyServer的初始化过程。
我们关注JettyCoreserver#bind方法时,我们会传达仪器对象,这是后来字节码重写(增强)的核心对象。
绑定方法将在第六部分进行详细分析,暂时将没有代码。
最后,它相对简单。反射调用JetTyCoreserver#GetLocal方法获取服务器IP和端口信息并返回。
完成上述过程后,作为代理的安装过程,沙盒核心的开始几乎完成了。我们将在此处简单地总结它:
SandBox.SH脚本运行后,Corelauncher.java中的主要功能将通过Java-Jar运行。主函数将通过附加代理在目标JVM上安装SandBox-Agent,并通过此类装载机加载Jettyserver,以完成后续操作。
目前,启动过程可以通过下图描述:
原始:https://juejin.cn/post/7101675446127263751