最近学习了javassist的使用方法。 
javassist是一个字节码类库,可以用他来动态生成类,动态修改类等等。

下面是如果用javassist来动态创建一个类的demol

我们需要创建的目标类,如下:

  1. public class JavassistClass{
  2. private String name="default";
  3. public JavassistClass(){
  4. name="me";
  5. }
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public void execute(){
  13. System.out.println(name);
  14. System.out.println("execute ok");
  15. }
  16. }

如下为用javassist来创建类的代码:

  1. import java.lang.reflect.Method;
  2. import java.lang.reflect.Modifier;
  3. import javassist.ClassPool;
  4. import javassist.CtClass;
  5. import javassist.CtConstructor;
  6. import javassist.CtField;
  7. import javassist.CtField.Initializer;
  8. import javassist.CtMethod;
  9. import javassist.CtNewMethod;
  10. public class JavassistLearn{
  11. public static void main(String[] args) throws Exception{
  12. ClassPool cp=ClassPool.getDefault();
  13. CtClass ctClass=cp.makeClass("com.slovef.JavassistClass");
  14. StringBuffer body=null;
  15. //参数  1:属性类型  2:属性名称  3:所属类CtClass
  16. CtField ctField=new CtField(cp.get("java.lang.String"), "name", ctClass);
  17. ctField.setModifiers(Modifier.PRIVATE);
  18. //设置name属性的get set方法
  19. ctClass.addMethod(CtNewMethod.setter("setName", ctField));
  20. ctClass.addMethod(CtNewMethod.getter("getName", ctField));
  21. ctClass.addField(ctField, Initializer.constant("default"));
  22. //参数  1:参数类型   2:所属类CtClass
  23. CtConstructor ctConstructor=new CtConstructor(new CtClass[]{}, ctClass);
  24. body=new StringBuffer();
  25. body.append("{\n name=\"me\";\n}");
  26. ctConstructor.setBody(body.toString());
  27. ctClass.addConstructor(ctConstructor);
  28. //参数:  1:返回类型  2:方法名称  3:传入参数类型  4:所属类CtClass
  29. CtMethod ctMethod=new CtMethod(CtClass.voidType,"execute",new CtClass[]{},ctClass);
  30. ctMethod.setModifiers(Modifier.PUBLIC);
  31. body=new StringBuffer();
  32. body.append("{\n System.out.println(name);");
  33. body.append("\n System.out.println(\"execute ok\");");
  34. body.append("\n return ;");
  35. body.append("\n}");
  36. ctMethod.setBody(body.toString());
  37. ctClass.addMethod(ctMethod);
  38. Class<?> c=ctClass.toClass();
  39. Object o=c.newInstance();
  40. Method method=o.getClass().getMethod("execute", new Class[]{});
  41. //调用字节码生成类的execute方法
  42. method.invoke(o, new Object[]{});
  43. }
  44. }

javassist还有一个比较常见的用途是AOP,比如对一些类统一加权限过滤,加日志监控等等。 
下面示例如何使用javassist来进行AOP拦截处理

我们对上面例子的JavassistClass类的getName()方法进行拦截前置处理

    1. package com.taobao.relationrecommend.web.util;
    2. import java.lang.reflect.Method;
    3. import javassist.util.proxy.MethodFilter;
    4. import javassist.util.proxy.MethodHandler;
    5. import javassist.util.proxy.ProxyFactory;
    6. public class JavassistLearn{
    7. public static void main(String[] args) throws Exception{
    8. ProxyFactory factory=new ProxyFactory();
    9. //设置父类,ProxyFactory将会动态生成一个类,继承该父类
    10. factory.setSuperclass(JavassistClass.class);
    11. //设置过滤器,判断哪些方法调用需要被拦截
    12. factory.setFilter(new MethodFilter() {
    13. @Override
    14. public boolean isHandled(Method m) {
    15. if(m.getName().equals("getName")){
    16. return true;
    17. }
    18. return false;
    19. }
    20. });
    21. //设置拦截处理
    22. factory.setHandler(new MethodHandler() {
    23. @Override
    24. public Object invoke(Object self, Method thisMethod, Method proceed,
    25. Object[] args) throws Throwable {
    26. //拦截后前置处理,改写name属性的内容
    27. //实际情况可根据需求修改
    28. JavassistClass o=(JavassistClass) self;
    29. o.setName("haha");
    30. return proceed.invoke(self, args);
    31. }
    32. });
    33. Class<?> c=factory.createClass();
    34. JavassistClass object=(JavassistClass) c.newInstance();
    35. System.out.println(object.getName());
    36. }
    37. }

javassist学习的更多相关文章

  1. Javassist学习总结

    今天在弄dubbo时出现了一个依赖缺少问题,就好奇研究一下,这个依赖是啥. javassist是一个字节码类库,可以用他来动态生成类,动态修改类等等 1.介绍Javassist 要想将编译时不存在的类 ...

  2. Java学习之javassist

    1.读取和输出字节码 ClassPool pool = ClassPool.getDefault(); //会从classpath中查询该类 CtClass cc = pool.get("t ...

  3. 8.5(java学习笔记)8.5 字节码操作(javassist)

    一.javassist javassist让我们操作字节码更加简单,它是一个类库,允许我们修改字节码.它允许java程序动态的创建.修改类. javassist提供了两个层次的API,基于源码级别的和 ...

  4. java 学习之路

    一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://i ...

  5. Java 编程的动态性,第 6 部分: 利用 Javassist 进行面向方面的更改--转载

    本系列的 第 4 部分和 第 5 部分讨论了如何用 Javassist 对二进制类进行局部更改.这次您将学习以一种更强大的方式使用该框架,从而充分利用 Javassist 对在字节码中查找所有特定方法 ...

  6. Java数据持久层框架 MyBatis之API学习四(xml配置文件详解)

    摘录网址: http://blog.csdn.net/u010107350/article/details/51292500 对于MyBatis的学习而言,最好去MyBatis的官方文档:http:/ ...

  7. JAVAEE——BOS物流项目01:学习计划、搭建环境、主页设计(jQuery EasyUI)

    1 学习计划 1.项目概述 项目背景介绍 2.搭建项目开发环境 数据库环境 maven项目搭建 svn环境搭建 3.主页设计(jQuery EasyUI) layout页面布局 accordion折叠 ...

  8. MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射

    在上一章中我们学习了<MyBatis学习总结(一)——ORM概要与MyBatis快速起步>,这一章主要是介绍MyBatis核心配置文件.使用接口+XML实现完整数据访问.输入参数映射与输出 ...

  9. 我是怎样使用javassist将代码注入到帝国OL并进行调试的

    帝国OL是拉阔一款手机网络游戏(腾讯也有代理),我在中学时代玩儿过. 帝国OL还维护着KJava版本游戏客户端,这意味着我们可以在PC端使用模拟器玩儿游戏. 不过这篇文章我主要是关注如何通过代码注入拦 ...

随机推荐

  1. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

  2. Socket、RPC通信实例,简单版本,仅供查阅

    TCP/IP Socket 如果使用TCP协议来传递数据,客户端和服务器端需要分别经过以下步骤: server: 创建socket对象 - bind(绑定socket到指定地址和端口) - liste ...

  3. react native 触摸Touchable***的区别(TouchableWithoutFeedback、TouchableOpacity、TouchableHighlight、TouchableNativeFeedback)

    一.问题背景: react native的跨平台开发没有button的概念,而是使用touchable系列实现点击触发效果. 而touchable系列就有四个之多,而且相互之间仍有较大差别,这就给我们 ...

  4. WebLogic 12c CentOS7 静默安装

    JDK版本:1.8.0_161 Weblogic版本:12.2.1.3 一.前期准备 1.创建用户和组 # groupadd web # useradd -g web weblogic # passw ...

  5. SSM整合中每一框架需要做的基本操作简述

    1.dao层的工作 pojo和映射文件以及接口(使用逆向工程) SqlMapConfig.xml(Mybaits核心配置文件) ApplicationContext-dao.xml  整合后Sprin ...

  6. Common issue on financial information exchange (FIX) Connectivity[z]

    FIX Protocol Session Connectivity Hi guys, in this post I would like share my experience with financ ...

  7. 无生物学重复RNA-seq分析 CORNAS: coverage-dependent RNA-Seq analysis of gene expression data without biological replicates

    无生物学重复RNA-seq分析 CORNAS: coverage-dependent RNA-Seq analysis of gene expression data without biologic ...

  8. java MD5 并发

    Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.Rives ...

  9. HBase-1.2.1和Phoenix-4.7.0分布式安装指南

    目录 目录 1 1. 前言 2 2. 概念 2 2.1. Region name 2 3. 约定 2 4. 相关端口 3 5. 下载HBase 3 6. 安装步骤 3 6.1. 修改conf/regi ...

  10. CSS—— em的详解

    字体大小在浏览器的默认样式表中有规定.一般采用em为单位,也就是相对单位,1em=16像素. 同时,像P h1等等标签都采用浏览器默认的em单位,P为1em,h1为2em等等. 两条重要的规则: 1. ...