Javassist的用法

来源:互联网 发布:php扩展加密 编辑:程序博客网 时间:2024/05/29 16:06
1.初始化ClassPool:ClassPool cp = new ClassPool(true);
true代表使用当前类路径
2.插入类路径,通过类路径搜索要加载的类:cp.insertClassPath(new LoaderClassPath(XXX.class.getClassLoader()));
3.构建一个新的CtClass对象:CtClass targetClass = pool.makeClass("com.my.xxx");
4.实现一个接口:targetClass.addInterface(pool.get(IHello.class.getName()));
5.获取返回类型:CtClass returnType = pool.get(void.class.getName());
6.定义方法名称: String methodName = "xxxx";
7.设置参数类型:CtClass[] paramters = new CtClass[]{pool.get(String.class.getName())};
8.创建新的方法:CtMethod method = new CtMethod(returnType,methodName,paramters,targetClass);
9.设置方法体:String bodyStr = "{System.out.println(\"hello\")+$1}"
$1代表是创建的方法的参数
10.给方法设置方法体:method.setBody(bodyStr);


在插庄访问HttpServletRequest中的内容时,如果使用的是tomcat服务器,则需要在
method.insertBefore("类名.方法名($args)")后面加上
pool.get("类名").toClass(ClassLoader,null);
注:
类名是你需要插入进去的类,即编写监控代码的类,且类名必须带上包路径;
ClassLoader是传入的参数
加上上面那一行代码的原意:
JVM的classLoad是从上层向下层找,Tomcat是从下层向上层找
实例代码如下:
public class TestJavassitMain implements ClassFileTransformer{
//在应用或者web程序启动前调用
public static void premain(String argents, Instrumentation inst){inst.addTransformer(new TestJavassitMain());}

}
原创粉丝点击