Javassist 代码转换

该实例参考自 IMB DEVELOPERS

该实例主要实现,在对某一个方法进行转换,在其执行之前,运行某一个方法,来记录日志信息!

package org.java.javassist.six;

import javassist.*;

/**
 * 采用javassist实现代码转换:
 * 
 *     Javassist提供了两种方式用于对系统字节码修改的处理方法:
 *
 *     1. 代码转转:
 *     Java字节码修改的第一种Javassit技术使用javassist.CodeConverter类.
 *     要实现这种技术,需要创建CodeConverter实例并用一个或者多个转还操作配置。
 * 
* @author xianglj * @date 2016/7/15 * @time 11:23 */ public class TranslateConvert { public static void main(String[] args) { String className = "org.java.javassist.six.Bean"; //创建一个转换类加载器 // set up a class loader with translator ConverterTranslator xtls = new ConverterTranslator(); ClassPool classPool = ClassPool.getDefault(); //创建代码转换器 CodeConverter codeConverter = new CodeConverter(); try { CtClass ctClass = classPool.get(className); CtMethod ctMethod = ctClass.getDeclaredMethod("setA"); //获取ConverterTranslator的reportSet方法 CtMethod reportSet = classPool.get("org.java.javassist.six.TranslateConvert").getDeclaredMethod("reportSet"); //该方法用于设定,在执行setA 方法前执行 reportSet 方法 codeConverter.insertBeforeMethod(ctMethod, reportSet); //设置转换器 xtls.setConverter(codeConverter); /** * 该加载器,主要为了解决JVM不允许加载第二次class,因此 * Javassist自己提供了一个加载器,用于方便使用 */ Loader loader = new Loader(); loader.addTranslator(classPool, xtls); /** * 执行BeanTest总的Main方法 */ loader.run("org.java.javassist.six.BeanTest", args); } catch (NotFoundException e) { e.printStackTrace(); } catch (CannotCompileException e) { e.printStackTrace(); } catch (Throwable throwable) { throwable.printStackTrace(); } } public static void reportSet(Bean target, String value) { System.out.println("Call to set value " + value); } /** * 监听CtClass的声明周期 */ public static class ConverterTranslator implements Translator { private CodeConverter m_converter; private void setConverter(CodeConverter convert) { m_converter = convert; } public void start(ClassPool pool) { } @Override public void onLoad(ClassPool pool, String classname) throws NotFoundException, CannotCompileException { CtClass clas = pool.get(classname); clas.instrument(m_converter); } } }


你可能感兴趣的:(javassist)