您的位置:首页 > 编程语言 > Java开发

Javassist 代码转换

2016-07-15 15:08 387 查看
该实例参考自
IMB DEVELOPERS

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

package org.java.javassist.six;

import javassist.*;

/**
* 采用javassist实现代码转换:
* <pre>
* Javassist提供了两种方式用于对系统字节码修改的处理方法:
*
* 1. 代码转转:
* Java字节码修改的第一种Javassit技术使用javassist.CodeConverter类.
* 要实现这种技术,需要创建CodeConverter实例并用一个或者多个转还操作配置。
* </pre>
* @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 代码转换