Javassist简单应用小结

来源:互联网 发布:python 实现月份加减 编辑:程序博客网 时间:2024/05/18 02:44

参考1:http://blog.csdn.net/mousebaby808/article/details/37696371 看点:修改类方法名

@Test
public void test() throws Exception {
    // 获取本地类加载器
    ClassLoader classLoader = getLocaleClassLoader();
    // 获取要修改的类
    Class<?> clazz = classLoader.loadClass("edu.alvin.reflect.TestLib");

    // 实例化类型池对象
    ClassPool classPool = ClassPool.getDefault();
    // 设置类搜索路径
    classPool.appendClassPath(new ClassClassPath(clazz));
    // 从类型池中读取指定类型
    CtClass ctClass = classPool.get(clazz.getName());

    // 获取String类型参数集合
    CtClass[] paramTypes = {classPool.get(String.class.getName())};
    // 获取指定方法名称
    CtMethod method = ctClass.getDeclaredMethod("show", paramTypes);
    // 赋值方法到新方法中
    CtMethod newMethod = CtNewMethod.copy(method, ctClass, null);
    // 修改源方法名称
    String oldName = method.getName() + "$Impl";
    method.setName(oldName);

    // 修改原方法
    newMethod.setBody("{System.out.println(\"执行前\");" + oldName + "($$);System.out.println(\"执行后\");}");//注意:原来的方法是得到执行的,另外可以借助insertBefore等实现
    // 将新方法添加到类中
    ctClass.addMethod(newMethod);

    // 加载重新编译的类
    clazz = ctClass.toClass();        // 注意,这一行会将类冻结,无法在对字节码进行编辑
    // 执行方法
    clazz.getMethod("show", String.class).invoke(clazz.newInstance(), "hello");
    ctClass.defrost();    // 解冻一个类,对应freeze方法
}


参考2:http://blog.csdn.net/yczz/article/details/14497527 看点:打印方法的参数,各种$符号的含义

参考3:http://blog.csdn.net/sadfishsc/article/details/9999169 基本用法

0 0
原创粉丝点击