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标识符

java javassist库处理类的基本用法

用Javassist修改方法的几个问题

springboot 整合javassist详解

javassist两个jar包导致:.Department_$$_javassist_1 cannot be cast to javassist.util.proxy.Proxy

Javassist - 从方法中删除静态修饰符