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);
}
}
}
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);
}
}
}
相关文章推荐
- Hibernate 的学习笔记(温故而知新)— — 不定时更新
- javassist3.17.0-GA, 3.17.1-GA.jar包bug,java.lang.VerifyError: Inconsistent args count operand in invo
- DynamicGecco实现爬取规则的动态加载
- ASM javassist
- com.domain.*_$$_javassist_6 cannot be cast to javassist.util.proxy.Proxy问题
- java.lang.ClassCastException: $$_javassist_2 cannot be cast to javassist.util.proxy.Proxy
- Caused by: java.lang.IllegalArgumentException: Javassist library is missing in classpath! ..错误解决
- 【报错】ClassNotFoundException: javassist.util.proxy.MethodFilter
- 【实践】搭建agent服务+javassist字节码操作
- Java动态编程之javassist
- javassist使用教程(jar破解)
- java.lang.NoClassDefFoundError: javassist/util/proxy/MethodFilter
- 升级jdk8后系统报错解决:java.lang.RuntimeException: java.io.IOException: invalid constant type: 18
- VB.Net 与 C#代码 转换工具(网页版)
- 完美解决json循环问题(使用javassist增强):Spring MVC中使用jackson的MixInAnnotations方法动态过滤JSON字段
- Dubbo源码分析(二):Dubbo之消费端(Consumer)
- java:axis2环境下获取方法参数名的另一种方法
- jboss eap6出现Tags_$$_javassist_26 cannot be cast to javassist.util.proxy.ProxyObject的解决办法
- javassist使用与源码解析(一)
- 利用Javassist获取Java类中的方法参数名、参数类型、方法访问类型