本文主要是介绍Javassist的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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());}
}
这篇关于Javassist的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!