资讯专栏INFORMATION COLUMN

java agent 使用

mingde / 1783人阅读

摘要:的作用在字节码这个层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。

java agent的作用

在字节码这个层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。可以理解spring的aop技术

如何实现

实现javaagent需要实现premain方法

必须在MANIFEST.MF文件中有Premain-Class

demo实现 agent
  package com.xueyou.demo.agent;
     
    import javassist.ClassPool;
    import javassist.CtClass;
    import javassist.CtMethod;
    import javassist.CtNewMethod;
     
    import java.lang.instrument.ClassFileTransformer;
    import java.lang.instrument.IllegalClassFormatException;
    import java.security.ProtectionDomain;
     
    public class FirstAgent implements ClassFileTransformer {
        public final String injectedClassName = "com.xueyou.agentdemo.App";
        public final String methodName = "hello";
     
        public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
            className = className.replace("/", ".");
    //        System.out.println(className);
            if (className.equals(injectedClassName)) {
                CtClass ctclass = null;
                try {
                    ctclass = ClassPool.getDefault().get(className);// 使用全称,用于取得字节码类<使用javassist>
                    CtMethod ctmethod = ctclass.getDeclaredMethod(methodName);// 得到这方法实例
                    ctmethod.insertBefore("System.out.println(11111111);");
                    return ctclass.toBytecode();
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                    e.printStackTrace();
                }
            }
            return null;
        }
    }
预加载类
package com.xueyou.demo;
 
import com.xueyou.demo.agent.FirstAgent;
 
import java.lang.instrument.Instrumentation;
 
/**
 * Hello world!
 */
public class App {
    public static void premain(String agentOps, Instrumentation inst) {
        System.out.println("=========premain方法执行========");
        System.out.println(agentOps);
        // 添加Transformer
        inst.addTransformer(new FirstAgent());
    }
}
maven指定预加载类

        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.8
                    1.8
                    utf-8
                
            
            
                org.apache.maven.plugins
                maven-shade-plugin
                3.0.0
                
                    
                        package
                        
                            shade
                        
                        
                            
                                
                                    
                                       com.xueyou.demo.App
                                    
                                
                            
                        
                    
                
            
        
    
如何使用

这里有两种方式指定javaagent:
1)使用命令行:java -javaagent:XXX.jar ffffd.jar
2)使用idea的vm option选项。

转: https://blog.csdn.net/wild46c...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76488.html

相关文章

  • java agent开发

    摘要:介绍是插件或者叫做代理,她是运行在方法之前,她内定的方法名称叫。是不是很简单啊。。。。接下来,我们看看使用方式咯。。。。。注意包的结构要一样哦。。。。。好了,今天的文章到这里就结束了。。。最后还来一张运行结果吧。。。。 java agent介绍 java agent是jvm插件或者叫做代理,她是运行在main方法之前,她内定的方法名称叫premain。 java agent 概述 s...

    妤锋シ 评论0 收藏0
  • UAV MOF工作原理之Agent注入机制原理

    摘要:注入机制作为工作的基础,也为无侵入捕获应用数据提供可能。代码注入机制结合和技术,在应用字节码加载到之前进行字节码改写。当然,修改字节码文件流的动作是在中进行的。 UAVStack的中间件增强框架专题(MOF)】为大家详细讲述UAV中的MOF Agent是如何借助javaagent(premain)和javaassist技术在对应用无侵入的前提下完成数据捕获的。欢迎继续关注UAVStac...

    atinosun 评论0 收藏0
  • java agent 详细介绍

    摘要:简介是命令的一个参数。参数可以用于指定一个包,并且对该包有个要求这个包的文件必须指定项。重点就在方法,也就是我们今天的标题。和类加载器比较类加载器也可以实现运行时修改代码。使用能让修改字节码这个动作化于无形,对业务透明,减少侵入性。 简介 java agent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求: 这个 j...

    zhiwei 评论0 收藏0
  • 程序员练级攻略(2018):Java底层知识

    摘要:最黑科技的玩法就是字节码编程,也就是动态修改或是动态生成字节码。使用字节码编程可以玩出很多高级玩法,其中最高级的玩法是在程序运行时进行字节码修改和代码注入。 showImg(https://segmentfault.com/img/bVbkqqg?w=1142&h=640);这个是我订阅 陈皓老师在极客上的专栏《左耳听风》,我贴出来是为了自己以后方便学习和记忆,同时也分享给你们一起学习...

    wean 评论0 收藏0
  • Nodejs“实现”Dubbo Provider

    摘要:背景目前应用越来越广泛,但和的体系接入困难,所以我们需要实现端的逻辑。使用实现一个可用的完全没有问题,最简单的实现则是在对应集群注册接口与机器的映射关系,便可以访问对应接口。在评估了各种实现方案后,决定放弃开发端,使用的模式。 背景 目前nodejs应用越来越广泛,但和java的dubbo体系接入困难,所以我们需要实现node端的dubbo provider逻辑。java的dubbo ...

    Charles 评论0 收藏0

发表评论

0条评论

mingde

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<