{"id":15694082,"url":"https://github.com/v5tech/javaagent-samples","last_synced_at":"2025-05-08T06:00:14.302Z","repository":{"id":149461727,"uuid":"137453513","full_name":"v5tech/javaagent-samples","owner":"v5tech","description":"java instrument samples","archived":false,"fork":false,"pushed_at":"2018-06-15T07:26:15.000Z","size":12,"stargazers_count":7,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-08T06:00:07.496Z","etag":null,"topics":["bytebuddy","javaagent","javassist"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/v5tech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2018-06-15T07:09:45.000Z","updated_at":"2023-09-17T03:37:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"ff68ff72-bc1e-4588-b2fc-2a7db28241e9","html_url":"https://github.com/v5tech/javaagent-samples","commit_stats":null,"previous_names":["v5tech/javaagent-samples"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/v5tech%2Fjavaagent-samples","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/v5tech%2Fjavaagent-samples/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/v5tech%2Fjavaagent-samples/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/v5tech%2Fjavaagent-samples/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/v5tech","download_url":"https://codeload.github.com/v5tech/javaagent-samples/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253009892,"owners_count":21839714,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bytebuddy","javaagent","javassist"],"created_at":"2024-10-03T18:52:09.653Z","updated_at":"2025-05-08T06:00:14.252Z","avatar_url":"https://github.com/v5tech.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JavaAgent\n\n示例说明\n\n①、 `javassist.iedis.crack.IedisCrack1`和`javassist.iedis.crack.IedisCrack2`为使用`javassist`破解`iedis`插件的代码.\n\n最后将`tmp`目录下生成的`class`文件打包替换`iedis-2.43.jar`其操作命令如下:\n\n```bash\njar -uvf iedis-2.43.jar com/\n```\n\n②、`javaagent.sample.App`演示了`javaagent`结合`javassist`案例\n\n`javaagent.sample.transformer.IedisTransformer` 演示了使用`javaagent`结合`javassist`破解`iedis`插件\n\n`javaagent.sample.transformer.InjectPrintTransformer` 演示了使用`javaagent`结合`javassist`匹配返回值为`String`的方法，在其方法内插入代码，输出方法名、方法参数列表、方法返回值信息等。\n\n使用`javaagent`的方式破解`iedis`插件须知:\n\n确保`src/main/resources/META-INF/MANIFEST.MF`文件内容如下所示:\n\n```\nManifest-Version: 1.0\nPremain-Class: javaagent.sample.App\nCan-Redefine-Classes: true\nCan-Retransform-Classes: true\nCan-Set-Native-Method-Prefix: true\n\n```\n\n最后执行`mvn assembly:assembly`打包，然后在`idea.exe.vmoptions`或`idea64.exe.vmoptions`中添加`-javaagent:javaagent-samples-1.0.jar=iedis`重启`idea`使其生效。\n\n③、`javaagent.samples.sample1.Agent`演示了`javaagent`的基本用法，其内部声明了如下的两个方法:\n\n```java\npublic static void premain(String agentArgs, Instrumentation inst);  // a\npublic static void premain(String agentArgs);  // b\n```\n\na和b同时存在时，a会优先被执行，而b则会被忽略。具体参照 https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html \n\n`javaagent.samples.sample1.AgentTest` 运行启动类，在ide中运行时需添加jvm参数\n\nadd VM options:\n\n`-javaagent:javaagent-samples-1.0.jar=agent1,agent2`\n\n\n确保`src/main/resources/META-INF/MANIFEST.MF`文件内容如下所示:\n\n```\nManifest-Version: 1.0\nPremain-Class: javaagent.samples.sample1.Agent\nCan-Redefine-Classes: true\nCan-Retransform-Classes: true\nCan-Set-Native-Method-Prefix: true\n\n```\n\n最后执行`mvn assembly:assembly`打包，在`ide`中运行`javaagent.samples.sample1.AgentTest`观察控制台输出，其输出大致如下所示：\n\n```\n---------public static void premain(String agentArgs, Instrumentation inst)---------\u003eagent1,agent2\nHello,Agent!\n```\n\n\n④、`javaagent.samples.sample2.Agent`演示了使用`javaagent`结合`javassist`增强方法，在`javaagent.samples.sample2`包下的方法中插入计算方法执行耗时的代码\n\n其中`javaagent.samples.sample2.PerformMonitorTransformer`为核心业务代码，请务必理解该部分代码.\n\n`javaagent.samples.sample2.AgentTest`为运行启动类，在ide中运行时需添加jvm参数\n                                          \nadd VM options:\n\n`-javaagent:javaagent-samples-1.0.jar`\n\n\n确保`src/main/resources/META-INF/MANIFEST.MF`文件内容如下所示:\n\n```\nManifest-Version: 1.0\nPremain-Class: javaagent.samples.sample2.Agent\nCan-Redefine-Classes: true\nCan-Retransform-Classes: true\nCan-Set-Native-Method-Prefix: true\n\n```\n\n最后执行`mvn assembly:assembly`打包，在`ide`中运行`javaagent.samples.sample2.AgentTest`观察控制台输出，其输出大致如下所示：\n\n```\nthis is an perform monitor agent.\nnow transform: [javaagent.samples.sample2.AgentTest]\nthis is fun 1.\nmethod:[fun1] cost:[77399ns]\nthis is fun 2.\nmethod:[fun2] cost:[18123ns]\n------------------------------------\nnow transform: [javaagent.samples.sample2.Another]\nthis is fun 3.\nmethod:[fun3] cost:[58521ns]\nthis is fun 4.\nmethod:[fun4] cost:[18123ns]\n```\n\n⑤、`javaagent.samples.sample3.Agent`演示了使用`javaagent`结合`bytebuddy`增强方法，拦截`javaagent.samples.sample3.example`包下的方法，统计其运行所花费的时间\n\n`javaagent.samples.sample3.RunTimeInterceptor`为自定义的`bytebuddy`拦截器，务必理解`javaagent.samples.sample3.Agent`和`javaagent.samples.sample3.RunTimeInterceptor`中的代码逻辑\n\n`javaagent.samples.sample3.example.AgentTest`为运行启动类，在ide中运行时需添加jvm参数\n\nadd VM options:\n\n`-javaagent:javaagent-samples-1.0.jar`\n\n\n确保`src/main/resources/META-INF/MANIFEST.MF`文件内容如下所示:\n\n```\nManifest-Version: 1.0\nPremain-Class: javaagent.samples.sample3.Agent\nCan-Redefine-Classes: true\nCan-Retransform-Classes: true\nCan-Set-Native-Method-Prefix: true\n\n```\n\n最后执行`mvn assembly:assembly`打包，在`ide`中运行`javaagent.samples.sample3.example.AgentTest`观察控制台输出，其输出大致如下所示：\n\n```\nthis is an perform monitor agent.\n\nthis is fun 1.\nprivate void javaagent.samples.sample3.example.AgentTest.fun1() throws java.lang.Exception: took 500ms\n\n\nthis is fun 2.\nprivate void javaagent.samples.sample3.example.AgentTest.fun2() throws java.lang.Exception: took 1000ms\n\n\npublic static void javaagent.samples.sample3.example.AgentTest.main(java.lang.String[]) throws java.lang.Exception: took 1500ms\n\n```\n\n⑥、`javaagent.samples.sample4.Agent`演示了使用`javaagent`每隔`5000`毫秒输出一次程序内存和GC情况\n\n`javaagent.samples.sample4.Metric`里面是程序运行期间jvm内存和gc的业务逻辑代码\n\n`javaagent.samples.sample4.AgentTest`为运行启动类，在ide中运行时需添加jvm参数\n\nadd VM options:\n\n`-javaagent:javaagent-samples-1.0.jar`\n\n\n确保`src/main/resources/META-INF/MANIFEST.MF`文件内容如下所示:\n\n```\nManifest-Version: 1.0\nPremain-Class: javaagent.samples.sample4.Agent\nCan-Redefine-Classes: true\nCan-Retransform-Classes: true\nCan-Set-Native-Method-Prefix: true\n\n```\n\n最后执行`mvn assembly:assembly`打包，在`ide`中运行`javaagent.samples.sample4.AgentTest`观察控制台输出，其输出大致如下所示：\n\n```\nthis is an perform monitor agent.\n\n\ninit: 256MB\t max: 3621MB\t used: 6MB\t committed: 245MB\t use rate: 2%\ninit: 2MB\t max: 0MB\t used: 6MB\t committed: 8MB\t use rate: 82%\n\nname: PS Scavenge\t count:0\t took:0\t pool name:[PS Eden Space, PS Survivor Space]\nname: PS MarkSweep\t count:0\t took:0\t pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]\n\ninit: 256MB\t max: 3621MB\t used: 148MB\t committed: 991MB\t use rate: 14%\ninit: 2MB\t max: 0MB\t used: 7MB\t committed: 8MB\t use rate: 83%\n\nname: PS Scavenge\t count:10\t took:96\t pool name:[PS Eden Space, PS Survivor Space]\nname: PS MarkSweep\t count:0\t took:0\t pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]\n\ninit: 256MB\t max: 3621MB\t used: 837MB\t committed: 1483MB\t use rate: 56%\ninit: 2MB\t max: 0MB\t used: 7MB\t committed: 8MB\t use rate: 84%\n\nname: PS Scavenge\t count:12\t took:98\t pool name:[PS Eden Space, PS Survivor Space]\nname: PS MarkSweep\t count:0\t took:0\t pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]\n\ninit: 256MB\t max: 3621MB\t used: 592MB\t committed: 1360MB\t use rate: 43%\ninit: 2MB\t max: 0MB\t used: 7MB\t committed: 8MB\t use rate: 84%\n\nname: PS Scavenge\t count:14\t took:99\t pool name:[PS Eden Space, PS Survivor Space]\nname: PS MarkSweep\t count:0\t took:0\t pool name:[PS Eden Space, PS Survivor Space, PS Old Gen]\n```\n\n# 参考文档\n\n\n* JavaAgent\n\n\nhttps://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html\n\n\nhttps://zeroturnaround.com/rebellabs/how-to-inspect-classes-in-your-jvm\n\n\n* javassist\n\n\nhttps://jboss-javassist.github.io/javassist/tutorial/tutorial.html\n\n\nhttps://jboss-javassist.github.io/javassist/tutorial/tutorial2.html\n\n\nhttp://zhxing.iteye.com/blog/1703305\n\n\n* bytebuddy\n\n\nhttp://bytebuddy.net\n\n\nhttps://notes.diguage.com/byte-buddy-tutorial\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fv5tech%2Fjavaagent-samples","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fv5tech%2Fjavaagent-samples","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fv5tech%2Fjavaagent-samples/lists"}