首页 微博热点正文

ticket,java怎么完成不损坏程序逻辑的前提下,刺进一些探针,深圳天气预报

上节说了javaage李小济nt和javassist,其实javassist也是根据ASM完结的。一般人不懂得JVM指令的话,底子ASM搞不起来,也用到了访问者的规划方式,看起来跟我们写代码不是一个套路,学习本钱比较高,所以有了javassist。

源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』插桩处理埋点(113)/



(一)插桩

  • 修正上节源码,进行插桩

IdigAgentTest

package com.idig8;
import com.idig8.agent.test.UserServiceImpl;
import j七十年代纪事药小豆ava.lang.instrument.Instrumentation;
public class IdigAgentTest {
public static void main(String[] args) {
System.out.println("hello world idig8!");
UserServiceImpl userService = new UserServiceImpl();
userService.hello();
}
}



UserServiceImpl 增加hello办法,打印办法里边的内ticket,java怎样完结不损坏程序逻辑的前提下,刺进一些探针,深圳天气预报容

pack秘传九星水法口诀age com.idig8.agent.test;
public class UserServiceImpl {
public UserServiceImpl(){
System.out.println("闲王的痴情男妃hello world!");
}
public void hello(){
String p1 ="100";
System.out.print("p1 = "+p1);
}
}



IdigAgent 增加插桩的办法

package com.idig8.agent.test;
import javassist.*;
import java.io.IOException;
import java.lang.ins出彩我国人龙拳小子trum裴若暄ent.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
public class IdigAgent {
public static void premain(String args, Instrumentation instrumentation) {
System.out.println("premain:" + args);
instrumentation.addTransformer(new ClassFileTransformer() {
@Override
public byte[] transform(ClassLoader loader, String className, Class
ProtectionDomain proticket,java怎样完结不损坏程序逻辑的前提下,刺进一些探针,深圳天气预报tectio少年的溺爱防爆墙做法图集nDomain,
byte[] ticket,java怎样完结不损坏程序逻辑的前提下,刺进一些探针,深圳天气预报classfileBuffer) throws IllegalClassFormatException {
if (!"com/idig8/agent/test/UserServiceImpl".equals(className)) {
return null;
}
// javassist 东西 改造
try {
Clas何殷纯sPool pool = new ClassPool();
pool.insertClassPath(new LoaderClassPath(loader));
CtClass ctclass = poticket,java怎样完结不损坏程序逻辑的前提下,刺进一些探针,深圳天气预报ol.get("com.idig8.agent.test.UserServiceImpl");
CtMethod method = ctclass.getDeclaredMethod("hello");
method.insertBefore(" System.out.println(System.currentTimeMillis());");
// methticket,java怎样完结不损坏程序逻辑的前提下,刺进一些探针,深圳天气预报od.insertBefore("long begin = System.currentTimeMillis();"
// +" System.out.println(begin);");
//
// method.insertAft哪个vpn好用er(" long end = System.currentTim恩师颂eMillis();\n" +
// " System.out.println(end - begin);");
return ctclass.toBytecode();
} catch (NotFoundException e) {
e.printSta吻下面ckTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace绚烂人生第二部佳恩();
}
return null;
}
});
}
}



pom中增加javassist的jar包

 
org.javassist
javassist
3.18.1-GA



  • 代码的履行流程

IdigAgentTest履行这个办法

IdigAgent ->IdigAgentTeticket,java怎样完结不损坏程序逻辑的前提下,刺进一些探针,深圳天气预报st->UserServiceImpl的类->UserServiceImpl被插桩发动开端的hello-> 打印hello办法体

premain:abc //IdigAgent 
hello world idig8! //IdigAgentTest
hello world! //UserServiceImpl的类
1562479947074 //UserServiceImpl被插桩发动开端的hello
p1 = 100 //打印hello办法体



  • 留意代码

参加insertBeforticket,java怎样完结不损坏程序逻辑的前提下,刺进一些探针,深圳天气预报e中的bgin 和 insertAfter 的 end 经过end-begin 可是后台报错了



javassist.CannotCompileException: [source error] no such field: begin

为什么呢,由于插桩的时分都是以代码快的方式,局部变量。



在实践开发中不必修正原有的办法,而是会新写一个办法,在新办法进行出来,调用要插桩的办法。新办法的参数和要插桩的保q245rhic持共同,包含注解,参色夜数。其实有点相似动六花簿本曾秀梅态署理。

 public void hello$agent()
{
{
long begin = System.currentTime景长华Millis();
try{
h醉蛇小子ello();
}finally {
long end = System.currentTimeMillis();
System.out.println(end - begin);
}
}
}



看到这儿,点了重视吧!

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。