您的位置 首页 > 德语词汇

instrumentation是什么意思,instrumentation的意思翻译、 Java动态编程之Instrumentation

大家好,instrumentation是什么意思,instrumentation的意思翻译、相信很多的网友都不是很明白,包括Java动态编程之Instrumentation也是一样,不过没有关系,接下来就来为大家分享关于instrumentation是什么意思,instrumentation的意思翻译、和Java动态编程之Instrumentation的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

instrumentation是什么意思,instrumentation的意思翻译、 Java动态编程之Instrumentation

在不修改代码重新发布的情况下,查看一个线上正运行代码的方法的入参、返回值,或者增加某些日志的打印

arthasbtrace自定义classloader,发现需要动态加载的类定义变更时对类进行重新加载打破双亲委派本文暂不讨论自定义classloader方式,工具的具体使用方法可以查看官方文档,那么这些工具的底层是如何实现的呢?没错他们底层都使用了JDK提供的Instrumentation接口。那么Instrumentation接口如何使用呢?

以下内容为翻译的该接口的javadoc该类提供测试Java编程语言代码所需的服务。Instrumentation是将字节码添加至方法中为收集工具所使用的数据。因为改变是纯添加动作,这些工具不会改变应用状态或行为。像这样良性的工具案例包含监控代理agents,profilers,coverageanalyzers,andeventloggers.获取该接口实例的方法有两种:

当JVM通过显示的指定一个代理类的方式运行。在这种情形下,Instrumentation实例通过代理类的premain方法传入JVM提供一个机制在JVM运行之后启动代理。在这种情形下,Instrumentation实例通过代理代码的agentmain方法传入

案例代码取自arthaspom配置为生成的manifest文件中指定premain代码提供类以及代理类提供类

<plugin>\n<groupId>org.apache.maven.plugins</groupId>\n<artifactId>maven-assembly-plugin</artifactId>\n<executions>\n<execution>\n<goals>\n<goal>single</goal>\n</goals>\n<phase>package</phase>\n<configuration>\n<descriptorRefs>\n<descriptorRef>jar-with-dependencies</descriptorRef>\n</descriptorRefs>\n<archive>\n<manifestEntries>\n<Premain-Class>com.taobao.arthas.agent.AgentBootstrap</Premain-Class>\n<Agent-Class>com.taobao.arthas.agent.AgentBootstrap</Agent-Class>\n<Can-Redefine-Classes>true</Can-Redefine-Classes>\n<Can-Retransform-Classes>true</Can-Retransform-Classes>\n<Specification-Title>${project.name}</Specification-Title>\n<Specification-Version>${project.version}</Specification-Version>\n<Implementation-Title>${project.name}</Implementation-Title>\n<Implementation-Version>${project.version}</Implementation-Version>\n</manifestEntries>\n</archive>\n</configuration>\n</execution>\n</executions>\n</plugin>\n

代理类、premain方法提供类编写接收Instrumentation实例的方法

//通过-agent方法显示指定方式启动JVM时会回调该方法传入Instrumentation实例\npublicstaticvoidpremain(Stringargs,Instrumentationinst){\nmain(args,inst);\n}\n

将premain提供类打成jar包。启动其他jvm时将该该jar作为agent参数出入即可,启动命令如下:

java-javaagent"${HOME}/.arthas/lib/3.1.0/arthas/arthas-agent.jar"...\nJVM启动后再启动代理方式获取

同上中方式相同,maven的pom配置为生成的manifest文件中指定agent代码提供类代理类方法提供类编写接收Instrumentation实例的方法

//JVM启动后,通过VM.attach方式附加至目标JVM时回调该方法传入Instrumentation\npublicstaticvoidagentmain(Stringargs,Instrumentationinst){\nmain(args,inst);\n}\n

将代理类附加到目标JVM

privatevoidattachAgent(Configureconfigure)throwsException{\n//根据PID获取目标JVM描述实例\nVirtualMachineDescriptorvirtualMachineDescriptor=null;\nfor(VirtualMachineDescriptordescriptor:VirtualMachine.list()){\nStringpid=descriptor.id();\nif(pid.equals(Integer.toString(configure.getJavaPid()))){\nvirtualMachineDescriptor=descriptor;\n}\n}\nVirtualMachinevirtualMachine=null;\ntry{\n//通过pid方式直接依附至目标JVM\nif(null==virtualMachineDescriptor){//使用attach(Stringpid)这种方式\nvirtualMachine=VirtualMachine.attach(""+configure.getJavaPid());\n}else{\n//通过JVM描述符方式依附\nvirtualMachine=VirtualMachine.attach(virtualMachineDescriptor);\n}\n...\n//为依附上的目标JVM加载代理jar\nvirtualMachine.loadAgent(arthasAgentPath,\nconfigure.getArthasCore()+";"+configure.toString());\n...\n}\n

通过Instrumentation转换类字节码实现ClassFileTransformer接口的transform方法

@Override\npublicbyte[]transform(finalClassLoaderinClassLoader,StringclassName,Class<?>classBeingRedefined,ProtectionDomainprotectionDomain,byte[]classfileBuffer)throwsIllegalClassFormatException{\n...\n//inClassLoader:将要被转换类所在的类加载器,如果是bootstraploader则该参数为null\n//className:将要被转换类的全限定名称\n//classBeingRedefined:将要被转换类的class\n//protectionDomain:将要被转换类的保护域\n//classfileBuffer:将要被转换类的字节码\n//修改增强后的字节码\nreturnenhanceClassByteArray;\n...\n}\n

将ClassFileTransformer实现添加至Instrumentation,并执行转换

//Enhancer为arthas中提供的ClassFileTransformer实现类\nfinalEnhancerenhancer=newEnhancer(adviceId,isTracing,skipJDKTrace,enhanceClassSet,methodNameMatcher,affect);\n//将转换类添加至Instrumentation\ninst.addTransformer(enhancer,true);\n...\n//执行转换\ninst.retransformClasses(clazz);\n总结

instrumentation.addTransformer的第二个参数canRetransform如果不指定默认为false,如果为true,则在显示调用retransformClasses时会立即回调。jdkapi文档中指明在转换类定义之前已经实例化的对象不会受影响,这种说法指的应该是因为对象不能新增、删除、更改字段方法等,所以类型的实例不会受到重定义的影响;但是对于方法的修改会生效,官方也有说明:已经入栈的方法不会受影响,但是对于下一次方法调用则会使用新的定义ClassFileTransformer实例中要对类名称进行匹配,因为其他类加载时也可能会走到该转换类中导致出现异常,例如:

关于instrumentation是什么意思,instrumentation的意思翻译、到此分享完毕,希望能帮助到您。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023