zoukankan      html  css  js  c++  java
  • instrument(2)

    学习了instrument之后试着自己写点东西,上一篇的例子中使用的是asm,毕竟是面向字节码的,api还是比较复杂的。其实有时候的需求很简单,无非就是看下类里的方法啊之类的。javassist是基于源码级别的API比基于字节码的ASM简单。下面就是对使用到的类打印出所有方法的Transformer:

    [java] view plain copy
    1. public class TestTransformer implements ClassFileTransformer {  
    2.     @Override  
    3.     public byte[] transform(ClassLoader classLoader, String className, Class<?> aClass, ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException {  
    4.         //javassist的包名是用点分割的,需要转换下  
    5.         String compareClass = className.replace('/''.');  
    6.         //通过包名获取类文件  
    7.         CtClass clazz = null;  
    8.         try {  
    9.             clazz = ClassPool.getDefault().get(compareClass);  
    10.             CtMethod[] methods = clazz.getMethods();  
    11.             for(CtMethod method:methods){  
    12.                 System.out.println(className + ",has method:" + method.getName());  
    13.             }  
    14.         } catch (NotFoundException e) {  
    15.             e.printStackTrace();  
    16.         }  
    17.         return bytes;  
    18.     }  
    19. }  


    比用asm的简单多了。

    再说下IDEA上面怎么打jar包和调试这样的程序。首先点击Project structure。点左边的Artifacts,然后点“+”选jar,再选Empty。然后对jar包取个名字,在Output Layout里加入你想要打进去的资源。如果定义了MF文件,设置下MF文件路径。

    idea jar设置

    点击ok之后就可以在Build菜单中选择Build Artifacts 就ok了。jar包的目录在上面配置的Output directory里。如果你的测试代码放在同一个工程里,可以在新建一个Application应用,然后在VM options中配置jar包的路径 -javaagent:/Users/ykdsg/my_workspace/class_instrument/out/artifacts/hackX/hackX.jar 。这样就ok了,debug的时候,断点甚至能进入Transformer,IDEA还是相当牛逼的。

  • 相关阅读:
    02.替换空格 (Java)
    01.二维数组中的查找 (Java)
    css
    CSS Selectors
    Golang Singleton
    TL;DR
    go get
    golang string、int、int64 float 互相转换
    Thrift支持的基本数据类型
    双亲委派模型
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7452498.html
Copyright © 2011-2022 走看看