GVKun编程网logo

如何在不停止JVM的情况下将Javaagent添加到JVM?(如何在java程序运行时不停机动态加载一个函数进来)

27

如果您对如何在不停止JVM的情况下将Javaagent添加到JVM?和如何在java程序运行时不停机动态加载一个函数进来感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何在不停止JVM的情况下

如果您对如何在不停止JVM的情况下将Javaagent添加到JVM?如何在java程序运行时不停机动态加载一个函数进来感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何在不停止JVM的情况下将Javaagent添加到JVM?的各种细节,并对如何在java程序运行时不停机动态加载一个函数进来进行深入的分析,此外还有关于java – JVM Spec,JVM Implementation,JVM Runtime之间的区别、java – 如何在不编辑源文件的情况下将方法添加到源文件?、Java 是否可以在不安装jar的情况下将jar添加到maven 2 build classpath?、Java探针技术-JVM的动态agent机制:在main函数启动之后运行agent的实用技巧。

本文目录一览:

如何在不停止JVM的情况下将Javaagent添加到JVM?(如何在java程序运行时不停机动态加载一个函数进来)

如何在不停止JVM的情况下将Javaagent添加到JVM?(如何在java程序运行时不停机动态加载一个函数进来)

我希望在不停止应用程序的情况下分析Java应用程序。我可以在应用程序运行时以某种方式添加Javaagent吗?

答案1

小编典典

根据java.lang.instrument软件包的文档,应该是可能的。

VM启动后启动代理

一个实现可以提供一种机制,可以在VM启动之后的某个时间启动代理。有关如何启动的详细信息是特定于实现的,但通常应用程序已启动并且其主要方法已被调用。在虚拟机启动后实现支持启动代理的情况下,适用以下规则:

1.代理JAR的清单必须包含属性Agent-Class。此属性的值是代理类的名称。
2.代理类必须实现公共静态agentmain方法。
3.系统类加载器(ClassLoader.getSystemClassLoader)必须支持将代理JAR文件添加到系统类路径的机制。

但我从来没有尝试过 :-|

java – JVM Spec,JVM Implementation,JVM Runtime之间的区别

java – JVM Spec,JVM Implementation,JVM Runtime之间的区别

我读了以下几个字,但我想知道它们之间的差异……
JVM规范,JVM实现,JVM运行时

解决方法

JVM Spec:描述JVM应如何表现的文档.

JVM实现:基于JVM Spec的JVM实现.

JVM运行时:JVM实现的一个实例.

java – 如何在不编辑源文件的情况下将方法添加到源文件?

java – 如何在不编辑源文件的情况下将方法添加到源文件?

我正在尝试向minecraft源文件添加一个方法,但我必须弄清楚如何在不实际编辑源文件的情况下进行,因为重新分发源文件是非法的,这些源文件必须包含在我正在创建的mod中.我需要将方法setInPortalZub()添加到位于net.minecraft.entity.player中的文件“EntityPlayer.我正在使用MCP / minecraft Forge API.我尝试创建EntityPlayer的实例,但我不确定怎么会这样.

解决方法

你即将进入coremods奇妙而令人沮丧的世界! FML中的Coremod(Forge ModLoader)是将任意代码注入vanilla minecraft类的“最简单”方法,而不必分发这些类文件的修改版本.

这是通过利用Object Web发布的ASM Bytecode操作框架来实现的.此框架允许您编写可在加载时读取和操作类的字节码的Java代码.

我不可能解释你必须采取的每一步来完成这一壮举,所以我会发布链接到我自己的coremod注入类,并试图解释每一个.

Here is the CorePlugin class.

CorePlugin类告诉Forge ModLoader在哪里找到执行代码注入的转换器类.

FML根据您的.jar文件清单找到此类:

Manifest-Version: 1.0
FMLCorePlugin: bspkrs.treecapitator.fml.asm.TreeCapitatorCorePlugin
FMLCorePluginContainsFMLMod: bspkrs.treecapitator.fml.TreeCapitatorMod
Created-By: 1.7.0 (Oracle Corporation)

FMLCorePlugin指定CorePlugin类的完全限定路径.如果你的.jar文件要包含一个常规的@Mod样式Forge ModLoader mod类,你还需要指定FMLCorePluginContainsFMLMod(尽管期望的值是未知的;我认为它实际上并不重要你为那里的值,但关键必须在那里).

现在为有趣的部分……实际的字节码转换器. Here is a link to the transformer for Treecapitator

在没有详细介绍的情况下,我编写了这个类,以便能够在Eclipse和“生产”中处理执行.这就是为什么有两个HashMaps;一个用于MCP执行,另一个用于混淆执行.每个加载的类首先传递给transform()方法.代码检查它是否是我们想要转换的类,如果是,则转换它.

实现所有这一切的最终结果是,无论何时创建ItemInWorldManager的实例,变换器都会运行,并将一行添加到removeBlock()方法中的特定位置.这一行作为一个廉价的块中断钩子,允许代码在玩家打破一个块时执行.

提示:

>获取Eclipse的ByteCode Outline插件.您可以在Object Web网站上找到它.
>有时,Eclipse / MCP中的类结构与混淆环境中的类结构不同
>这些都不是简单易懂的概念.使用Bytecode Outline插件查看要转换的类,无论是否包含要包含的代码.这应该可以帮助您找出要查找的“标记”以及您需要插入的ASM节点.

我希望有所帮助!

编辑:修复损坏的链接以引用仍包含类的旧分支.

Java 是否可以在不安装jar的情况下将jar添加到maven 2 build classpath?

Java 是否可以在不安装jar的情况下将jar添加到maven 2 build classpath?

在试验/快速而肮脏的开发阶段,Maven2让我发疯。

我有一个pom.xml文件,该文件定义了要使用的Web应用程序框架的依赖关系,并且可以从该文件快速生成入门项目。但是,有时我想链接到尚未pom.xml定义文件的第三方库,因此,不是pom.xml手动为第三方库创建文件并安装它,然后将依赖项添加到我的pom.xml,告诉Maven:“除了我定义的依赖项之外,还包括其中的所有jar /lib。”

看起来这应该很简单,但是如果是这样,我就缺少了一些东西。

任何有关如何执行此操作的指针将不胜感激。简而言之,如果有一种简单的方法将maven指向/lib目录并轻松创建一个pom.xml将所有封闭的jar映射到单个依赖项的方法,那么我就可以命名/安装并链接到一个依赖项,这也足够了。

答案1

小编典典

仅适用于丢弃代码

设置scope == system并仅组成一个groupId,artifactId和版本

<dependency>    <groupId>org.swinglabs</groupId>    <artifactId>swingx</artifactId>    <version>0.9.2</version>    <scope>system</scope>    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath></dependency>

Java探针技术-JVM的动态agent机制:在main函数启动之后运行agent

Java探针技术-JVM的动态agent机制:在main函数启动之后运行agent

  premain是Java SE5开始就提供的代理方式,由于其必须在命令行指定代理jar,并且代理类必须在main方法前启动。因此,要求开发者在应用前就必须确认代理的处理逻辑和参数内容等等。在有些场合下,premain代理方式不能满足需求。为解决运行时启动代理类的问题,Java SE6开始提供了在应用程序的VM启动后在动态添加代理的方式,即agentmain方式。 

与premain类似,agent方式同样需要提供一个agent jar,并且这个jar需要满足:

  1、在manifest中指定Agent-Class属性,值为代理类全路径

  2、代理类需要提供public static void agentmain(String args, Instrumentation inst)或public static void agentmain(String   args)方法。并且再二者同时存在时以前者优先。

args和inst和premain中的一致。

package aty.agent.after;

import java.lang.instrument.Instrumentation;

public class AgentAfterMain{
  public static void agentmain(String args, Instrumentation inst){
    System.out.println("loadagent after main run.args=" + args);     Class<?>[] classes = inst.getAllLoadedClasses();     for (Class<?> cls : classes){      
      System.out.println(cls.getName());     }     System.out.println("agent run completely.");   } }

  

将该代理类打成jar包,并修改MANIFEST.MF文件

Manifest-Version: 1.0

Agent-Class: aty.agent.after.AgentAfterMain

  编写好agent jar之后,需要将该jar挂接到目标进程的jvm中执行。由于agent main方式无法向pre main方式那样在命令行指定代理jar,因此需要借助Attach Tools  API。

  使用com.sun.tools.attach包下的VirtualMachine类,使用attach pid 来得到相应的VirtumalMachine,使用loadAgent 方法指定AgentMain所在类并加载。其中

com.sun.tools.attach.VirtualMachine的jar包是jdk下lib中的tools.jar

package aty.agent.after;
import com.sun.tools.attach.VirtualMachine;
public class RunAttach{
  public static void main(String[] args) throws Exception{
    // args[0]传入的是某个jvm进程的pid
    String targetPid = args[0];
    VirtualMachine vm = VirtualMachine.attach(targetPid);
    vm.loadAgent("F:/workspaces/j2se练习代码/jvm_high_api/agentmain.jar","toagent");
  }
}

关于如何在不停止JVM的情况下将Javaagent添加到JVM?如何在java程序运行时不停机动态加载一个函数进来的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于java – JVM Spec,JVM Implementation,JVM Runtime之间的区别、java – 如何在不编辑源文件的情况下将方法添加到源文件?、Java 是否可以在不安装jar的情况下将jar添加到maven 2 build classpath?、Java探针技术-JVM的动态agent机制:在main函数启动之后运行agent等相关知识的信息别忘了在本站进行查找喔。

本文标签: