当前位置: 首页 > 知识库问答 >
问题:

是否在premain期间加载了一次类,一旦应用程序的其余部分运行,就会再次加载

越景天
2023-03-14

我试图在服务器完成启动之前对它的一些类进行测试,因为我需要监视它的一些活动。在这种情况下,我使用带有premain方法的javaagent。此代理加载任何所需的类,并使用instrumentation接口的retransformClasses对它们进行检测。

我100%肯定我试图检测的类在服务器中运行,因为我以前通过迭代服务器加载的所有类检测过相同的类。因为这增加了服务器启动时的开销,所以我一直尝试使用上面的方法。当我在应用程序服务器之外运行时,它工作得非常好。但是当我试图在服务器上运行它时,检测部分将在没有任何异常的情况下执行,或者检测所需的类和方法。但是当应用程序在服务器上启动时,我不会从检测的方法中获得任何输出。

(例如,假设我试图对org.h2.jdbc.jdbcPreparedStatement类的ExecuteQuery方法进行测试。我必须将h2 jar添加到类路径中)

for (InstrumentationClass instrumentationClass : instrumentationClasses){
  Class currentClass = ClassLoader.getSystemClassLoader()
                                  .loadClass(instrumentationClass.getClassName());
  SchemaClass currentClassWithDetails = new SchemaClass(
      scenario.getScenarioName(), currentClass, instrumentationClass);
  InstrumentationClassTransformer.transformMe.add(currentClassWithDetails);
  instrumentation.retransformClasses(currentClass);
  InstrumentationClassTransformer.transformMe.remove(currentClassWithDetails);
}

当服务器的其余部分启动时,它是否可能加载同一个类的不同副本?有办法克服这一点吗?

共有1个答案

游鸣
2023-03-14

应用程序服务器通常使用子优先类加载器将应用程序与应用程序服务器的代码隔离开来。通过这种方式,可以简单地删除应用服务器的类加载器,从而不用重新启动JVM就可以取消应用程序的部署。

Java代理通过systemclassloader访问类,它保留对服务器应用程序类的引用。因此,org.h2.jdbc.jdbcPreparedStatement对于不同的类加载器可能存在两次--系统类加载器和应用程序类加载器--其中您只检测部署的应用程序中没有使用的类加载器。

然而,我确实想知道你的方法有什么意义。为什么不能安装ClassFileTransformer,并在加载类后检查名称是否为org/h2/jdbc/jdbcPreparedStatement和instrument。开销不能太大。这样,您就可以为任何类加载器检测类,并且在重新部署时也可以重新检测类。

 类似资料:
  • 在我的应用程序中,服务器类在启动时加载,所有数据缓存一次。 它是一个单例类,其实例变量不是易失的,即。 在findbug分析后,我必须将其更改为易失性,(如下所示 但在阅读了有关volatile的文章和Q/A之后,我认为volatile会使数据再次被加载,因为volatile会使信息从内存而不是缓存中读取。 那么我应该让我的变量不稳定吗? 如果不稳定,那么我必须再次加载我的数据

  • 我根据模板创建了一个应用程序,并填充了一些日志,如下所示 和 当我运行它时,我注意到有时它会启动三次。(有时,它会发射两次,有时发射一次)。 日志如下 起初,我以为是活动启动了3次,但是当我注销应用程序oncread时,它也启动了3次。我显式地放了一个静态变量,并且清楚地看到应用程序是3个不同的实例(因为变量没有在3次中递增)。 确认这不是因为配置更改或活动被终止(如中所述)https://sta

  • 我问这个问题,尽管它已经被问了很多次,因为我找了几个小时没有找到解决办法。 但这还不是全部:我工作区中的每个项目都有同样的问题。我什么都跑不了。起初我以为这是因为我在Eclipse启动时犯了一个错误,所以我关闭了它并重新打开了它,但我在正确的工作区中。 我试图清理/重建它,但不起作用。 我试图扰乱属性>Java构建路径,但不起作用。 我试图用一个简单的“Hello World”创建一个新项目,但不

  • 本文向大家介绍js怎么控制一次加载一张图片,加载完后再加载下一张相关面试题,主要包含被问及js怎么控制一次加载一张图片,加载完后再加载下一张时的应答技巧和注意事项,需要的朋友参考一下 参考回答: (1)方法1 alert('图片的宽度为:'+obj.width+';图片的高度为:'+obj.height); (2)方法2    

  • 问题内容: 我正在制作一个由CSS3驱动的简单目标网页。为了使它看起来很棒,有一个隆重的表演: 为了使它更加出色,我添加了一个悬停动画: 但是问题来了!我分配了这样的动画: 一切都很好:飞溅到用户脸上,当他徘徊时有很好的振动。用户模糊后,立即填充,平滑内容突然结束并重复-animation。(这对我来说是合乎逻辑的,但我不希望这样做)没有某种JavaScript类Jiggery Pokery,有什

  • 嗨,当我使用Selenium IDE记录一些测试时,我遇到了一个以前没有显示的奇怪问题。 > 打开Selenium IDE时,它不会自动获取url。 这是关键问题:一旦我停止录制或播放也会停止录制的测试用例,当我再次单击录制按钮时,它不再记录任何额外的操作。 我不确定这是Selenium IDE的问题还是Firefox的问题。我使用的是Selenium IDE 1.9.1和Firefox 17,当