Javassist 代码转换
Posted 专注着
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javassist 代码转换相关的知识,希望对你有一定的参考价值。
该实例参考自 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 代码转换的主要内容,如果未能解决你的问题,请参考以下文章
javassist两个jar包导致:.Department_$$_javassist_1 cannot be cast to javassist.util.proxy.Proxy