记录关于开发一个使用vm参数 -javaagent 引入jar包方式,实现源码植入的过程

实现:

在spring-boot前提下,使用maven,需要做的是

1.在pom文件下引入以下两个插件

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <Agent-Class>xxx.MyAgent</Agent-Class>
                            <Can-Redefine-Classes>true</Can-Redefine-Classes>
                            <Can-Retransform-Classes>true</Can-Retransform-Classes>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifestEntries>
                            <Premain-Class>xxx.MyAgent</Premain-Class>
                            <Agent-Class>xxx.MyAgent</Agent-Class>
                            <Can-Redefine-Classes>true</Can-Redefine-Classes>
                            <Can-Retransform-Classes>true</Can-Retransform-Classes>
                        </manifestEntries>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>attached</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2.实现xxx.MyAgent,里面需要一个premain方法

public class MyAgent {

    public static void premain(String agentArgs, Instrumentation instrumentation) {
        System.out.println("代码植入成功");
    }

}

3.打包

 4.使用

VM参数中添加 

-javaagent:全路径/xxx-with-dependencies.jar -javaagent:maven仓库路径/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar

ps:遇到的问题和解决

1.jeccg-boot框架在使用时,植入的代码中如果使用了spring,会提示组件不存在

解决:需要在启动类上增加两个注解

2.jeccg-boot在线表单对接使用代码植入的功能

解决思路:首先,在线表单实现java增强,指定某个类作为实现类看截图👇

 最重要的,植入代码里面通过切面编程,指定类作为入口,从而做到对方法的切面植入,在切面中实现需要植入的代码

@Aspect
@Component
public class MyAspect {
    //这里的ArchivesSXJC指定了监听的类,(java.util.List,String)是参数列表可以自定义,也可以写(..)表示不限制
    @Pointcut("execution(* *..ArchivesSXJC.*(java.util.List,String))")
    public void pointcut(){

    }
    @Before("pointcut()")
    public void before() {
        System.out.println("before()");
    }
    @After("pointcut()")
    public void after(){
        System.out.println("after()");
    }

    @AfterReturning(value = "pointcut()",returning = "o")
    public Object afterReturning(JoinPoint jp, Object o){
        System.out.println("afterReturning()");
        System.out.println(o);
        System.out.println(jp);
        return o;
    }
}

( 仅为思路,项目未实践)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值