Javassist学习总结

2023-05-16

要想将编译时不存在的类在运行时动态创建并加载,通常有两种策略:

1.      动态编译

2.      动态生成二进制字节码(.class)

对于第二种策略,实际上已经有诸多比较成熟的开源项目提供支持,如CGLib、ASM、Javassist等。这些开源项目通常都具备两方面的功能:

1.      动态创建新类或新接口的二进制字节码

2.      动态扩展现有类或接口的二进制字节码

其中,CGLib的底层基于ASM实现,是一个高效高性能的生成库;而ASM是一个轻量级的类库,但需要涉及到JVM的操作和指令;相比而言,Javassist要简单的多,完全是基于Java的API,但其性能相比前二者要差一些。

尽管如此,在性能要求相对低的场合,Javassist仍然十分有用,如JBoss中就调用了Javassist。

Javassist的官方网站如下:

http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/

如下的链接是一个很好的Javassist代码示例:

http://yonglin4605.iteye.com/blog/1396494

如下的链接深入研究了Javassist中的一些语法,其中第8小节处对参数形式的总结很有作用:

http://zhxing.iteye.com/blog/1703305

如下的链接是IBM DW关于Javassist一个较为完整的教程:

http://www.ibm.com/developerworks/cn/java/j-dyn0916/

如下的代码是动态创建Java类二进制字节码并通过反射调用的示例,可供参考:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtNewMethod;
import javassist.Modifier;
import javassist.NotFoundException;
import javassist.CtField.Initializer;

public class JavassistGenerator {
	
	public static void main(String[] args) throws CannotCompileException, NotFoundException, InstantiationException, IllegalAccessException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
		// 创建类
		ClassPool pool = ClassPool.getDefault();
		CtClass cls = pool.makeClass("cn.ibm.com.TestClass");
		
		// 添加私有成员name及其getter、setter方法
		CtField param = new CtField(pool.get("java.lang.String"), "name", cls);
		param.setModifiers(Modifier.PRIVATE);
		cls.addMethod(CtNewMethod.setter("setName", param));
		cls.addMethod(CtNewMethod.getter("getName", param));
		cls.addField(param, Initializer.constant(""));
		
		// 添加无参的构造体
		CtConstructor cons = new CtConstructor(new CtClass[] {}, cls);
		cons.setBody("{name = \"Brant\";}");
		cls.addConstructor(cons);
		
		// 添加有参的构造体
		cons = new CtConstructor(new CtClass[] {pool.get("java.lang.String")}, cls);
		cons.setBody("{$0.name = $1;}");
		cls.addConstructor(cons);
		
		// 打印创建类的类名
		System.out.println(cls.toClass());
		
		// 通过反射创建无参的实例,并调用getName方法
		Object o = Class.forName("cn.ibm.com.TestClass").newInstance();
		Method getter = o.getClass().getMethod("getName");
		System.out.println(getter.invoke(o));
		
		// 调用其setName方法
		Method setter = o.getClass().getMethod("setName", new Class[] {String.class});
		setter.invoke(o, "Adam");
		System.out.println(getter.invoke(o));
		
		// 通过反射创建有参的实例,并调用getName方法
		o = Class.forName("cn.ibm.com.TestClass").getConstructor(String.class).newInstance("Liu Jian");
		getter = o.getClass().getMethod("getName");
		System.out.println(getter.invoke(o));
	}

}


最后需要特别注意的是:

1.      Javassist不支持要创建或注入的类中存在泛型参数

2.      Javassist对@类型的注解(Annotation)只支持查询,不支持添加或修改

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javassist学习总结 的相关文章

  • CSS介绍

    文章目录 一 CSS介绍二 CSS的引入方式三 CSS选择器 一 CSS介绍 定义 层叠样式表作用 美化界面 设置标签文字大小 颜色 字体加粗等样式控制页面布局 设置浮动 定位等样式 基本语法 选择器 样式规则 样式规则 属性名1 属性值1
  • JavaScript介绍

    文章目录 一 JavaScript介绍二 JavaScript的引入方式三 JavaScript的变量与数据类型四 JavaScript中的函数五 JavaScript变量的作用域六 JavaScript运算符七 JavaScript判断语
  • JQuery介绍

    文章目录 一 JQuery介绍二 JQuery使用三 JQuery选择器四 JQuery选择集过滤五 JQuery选择集转移六 JQuery获取和操作标签内容七 JQuery获取和设置元素属性八 JQuery事件九 JQuery事件代理 事
  • 树莓派操作系统烧录

    准备 硬件 xff1a 树莓派4BMicroSD卡 xff08 16GB xff09 SD卡读卡器 软件 xff1a SD卡格式化软件 xff08 SDFormatter xff09 系统烧录软件 xff08 balenaEtcher xf
  • 嵌入式系统开发必读经典书目

    读本科的时候就对嵌入式系统感兴趣 xff0c 虽然在校的时候积累了大量材料 xff0c 但是在较长的时间里都没有机会细读 xff0c 这学期终于静下心来 xff0c 系统学习一遍 xff0c 期间把以前积累的各类教材或粗粗浏览或仔细揣摩 x
  • 百度笔试题2018

    题外话 首先我要吐槽一下 xff0c csdn简直是在作死啊 xff0c 复制博文底下的那个引用太恶心了 xff0c 我复制自己的博客 xff0c 还有引用 xff0c 啥玩意啊 所以我决定换地方了 xff0c 以后github xff08
  • 统计计算——基于R语言的随机数生成

    统计计算 基于R语言的随机数生成 R中常见一元分布函数 代码展示 xff1a set seed 191206 设置随机数种子 xff0c 为了保证多次生成的随机数一致 xff0c 需要保证数据一样情况下进行再次实验时可用到 N 61 100
  • 第九章 Linux下的虚拟化部署

    第一步 查看CPU信息 打开虚拟机安装程序在四种方式中选择第一种 找到对应镜像 走安装流程 等待安装完成 点击协议 点击我同意 即可打开虚拟机
  • 第二本书 第一章 linux中的网络配置

    配置新网络 ifconfig ping ip 指令的使用 无图形模式生成新网络 nmcil指令的使用 dhcp服务配置 块网卡上配置多个IP 设定dns
  • 阿里云培训-负载均衡(CLB/ALB)

    什么是传统型负载均衡CLB 传统型负载均衡CLB xff08 Classic Load Balancer xff09 是将访问流量根据转发策略分发到后端多台云服务器 xff08 ECS实例 xff09 的流量分发控制服务 CLB扩展了应用的
  • 阿里云培训-AS(弹性伸缩)

    什么是弹性伸缩Auto Scaling 弹性伸缩 xff08 Auto Scaling xff09 是根据业务需求和策略自动调整计算能力 xff08 即实例数量 xff09 的服务 您可以指定实例的类型 xff0c 即ECS实例或ECI实例
  • php源码安装

    php源码安装 下载php的rpm包并解压 在解压之后的目录中 xff0c 查看是否有configure xff0c 如果有此文件 xff0c 使用 configure gt make gt make install方式进行源码安装 roo
  • K8S集群部署

    环境准备 由于k8s 集群比较吃配置 xff0c 使用 按量计费 来进行学习 xff0c 三台 4核8G 的费用大概再 1 6元 小时 三台云服务器 配置 xff1a 2核2G 三台服务器内网互通 xff08 内网可以互相访问 VPC xf
  • K8S Pod

    Pod管理 Pod是可以创建和管理Kubernetes计算的最小可部署单元 xff0c 一个Pod代表着集群中运行的一个进程 xff0c 每个pod都有一个唯一的ip 一个pod类似一个豌豆荚 xff0c 包含一个或多个容器 xff08 通
  • 物联网之嵌入式设备

    物联网自提出以来 xff0c 业界对其定义也不断的加深优化 xff0c 使其更具体 更容易与现实结合 xff0c 不再只停留在概念上 xff0c 这其中离不开从业者的探索与发现 物联网按字面理解分三个部分 xff1a 一 物 xff0c 与
  • WIFI模块接入ONENET步骤

    文章目录 前言思维导图一 onenet c文件1 产品IDONENET程序 2 鉴权信息ONENET程序 3 设备IDONENET程序 二 esp8266 c文件1 WIFI名称及密码程序 2 IP及端口 三 打包数据函数 在onenet
  • K8S 控制器 service ingress

    控制器 Pod 的分类 自主式 Pod xff1a Pod 退出后不会被创建 控制器管理的 Pod xff1a 在控制器的生命周期里 xff0c 始终要维持 Pod 的副本数目 控制器类型 Replication Controller和Re
  • K8s---网络通信 Configmap secrer volumesk8s

    k8s网络通信简介 k8s通过CNI接口接入其他插件来实现网络通讯 目前比较流行的插件有flannel xff0c calico等 CNI插件存放位置 xff1a cat etc cni net d 10 flannel conflist
  • Linux进程管理动态查看进程top

    目录 一 解读top命令的显示信息 1 上半部分解读 xff08 前五行 xff09 2 后半部分 xff08 进程信息 xff09 二 top常用内部指令 一 解读top命令的显示信息 命令 xff1a top 注意 xff1a 在top
  • ENSP基本命令和小实验

    ENSP基本命令和小实验 ENSP基本命令1 历史命令查询2 配置主机名3 状态信息查询4 进入接口模式并查看信息5 配置文件管理命令6 关闭华为的信息提示中心7 永不超时8 配置双工及速率命令9 保存配置10 用SecureCRT链接eN

随机推荐

  • 一个刚毕业大学生的四个月苦逼程序员经历

    先来一个自我介绍 大学时排名老三 就暂且叫老三吧 xff0c 毕业于河南的一个还算可以的二本院校 xff0c 专业 地球信息科学与技术 首先介绍一下我的专业 xff0c 听着名字很高大上 xff0c 其实 xff0c 我们都叫他四不像专业
  • windows10系统下基于pybind11库进行c++代码调用python(pytorch)代码

    最近在学习基于lidar mos进行slam激光点云动态物体剔除的相关内容 xff0c 经过调研准备基于pybind11库在实际项目 c 43 43 中调用salsaNext代码 python 使用cmake在测试项目中引入pybind11
  • 事件流是什么

    事件流分为事件冒泡和事件捕获 事件流 xff1a 就是事件的流向 xff0c 先捕获 xff0c 再到事件源 xff0c 最后再冒泡 xff0c 一共分三个阶段 xff1a 捕获阶段 xff0c 事件源 xff0c 冒泡阶段 从上至下再出来
  • 实现浏览器访问基于workman的异步任务

    准备工作 xff1a 安装workman xff0c 引入 目录 xff1a 进程任务服务端service php 提交任务服务端service transit php index php cli模式开启service php和servic
  • socket套接字编程---UDP通信流程和代码编写

    文章目录 1 UDP通信流程和接口介绍1 1UDP通信流程 xff1a 1 2接口介绍 xff1a 1 2 1创建套接字1 2 2为套接字绑定地址信息1 2 3发送数据1 2 4接收数据1 2 5 关闭套接字 释放资源 2 UDP通信代码实
  • 关于嵌入式高级项目小组的规划(初稿)

    关于嵌入式高级项目小组的规划 xff08 初稿 xff09 一 想法初衷 大家好 xff0c 我是一个嵌入式爱好者 虽然不是电子专业 xff0c 也不是软件这些相关的专业 xff0c 但我就是感兴趣 xff0c 从做8位单片机实验到现在自学
  • 嵌入式算法11---矩阵转置与压缩

    在整个物联网系统中 xff0c 嵌入式设备作为数据采集 过滤 缓存 传输的节点 xff0c 前面系列文章分别介绍了嵌入式设备相关的各种数据过滤 校验和压缩存储算法 缓存和传输阶段 xff0c 考虑到嵌入式设备的存储空间和传输带宽限制 xff
  • win10下安装Ubuntu16.04双系统

    win10下安装Ubuntu16 04双系统 最近由于想体验一下Ubuntu系统 xff0c 由于虚拟机的体验不是很好 xff0c 所以便在电脑上试下装双系统 自己也是一步步按着网上的帖子来 xff0c 由于网上的教程都不是最新的而且有的也
  • 【Vue入门实践3】不调后端接口==>el-table单纯前端实现查询和重置功能==>【el-table组件使用】表格静态前端筛选、查询重置功能

    一个人的心理健康程度与接纳痛苦的程度成正比 感谢自己的不完美 目录 一 功能效果描述 二 el table自带筛选功能 三 前端假查询重置功能 1 el form表单 2 el table表格数据 3 search功能 4 reset重置功
  • 控制理论简要介绍

    文章目录 鲁棒控制自适应控制滑膜控制 xff08 变结构控制 xff09 模型预测控制 MPC RBF神经网络 xff08 单隐层神经网络 xff09 xff1a 模糊控制 鲁棒控制 xff08 H无穷 H2 混合控制和LMI控制 xff0
  • ConcurrentHashMap、synchronized与线程安全

    最近做的项目中遇到一个问题 xff1a 明明用了ConcurrentHashMap xff0c 可是始终线程不安全 除去项目中的业务逻辑 xff0c 简化后的代码如下 xff1a public class Test40 public sta
  • Spring MVC集成slf4j-logback

    1 Spring MVC集成slf4j log4j 关于slf4j和log4j的相关介绍和用法 xff0c 网上有很多文章可供参考 xff0c 但是关于logback的 xff0c 尤其是Spring MVC集成logback的 xff0c
  • Spring Bean 创建过程

    0 通常 xff0c 无论是DispatcherServlet ContextLoaderListener还是ClassPathXmlApplicationContext xff0c 首次实例化bean的入口并不是在每次调用getBean的
  • MySQL DataSource 性能对比(2015-8-19)

    1 本地性能测试耗时 xff08 一 xff09 共同条件 xff1a 测试程序与数据库在同一台主机上 xff0c 各DataSource均采用默认配置 xff0c 每个线程循环1000次 xff0c 查询语句为select from ta
  • MySQL 乐观锁 简例

    乐观锁与悲观锁不同的是 xff0c 它是一种逻辑上的锁 xff0c 而不需要数据库提供锁机制来支持 当数据很重要 xff0c 回滚或重试一次需要很大的开销时 xff0c 需要保证操作的ACID性质 xff0c 此时应该采用悲观锁 而当数据对
  • HTML5 Canvas 初步:字符串,路径,背景,图片

    HTML5中新增了 lt canvas gt 画布标签 xff0c 通过它 xff0c 可以使用JavaScript在网页中绘制图像 lt canvas gt 标签在网页中得到的是一个矩形空白区域 xff0c 可以通过width和heigh
  • CSS 伪类与伪元素

    CSS的元素选择器除了根据id xff08 xff09 class xff08 xff09 属性 xff08 xff09 选取元素以外 xff0c 还有很重要的一类 xff0c 就是根据元素的特殊状态来选取元素 它们就是伪类和伪元素 跟id
  • 阿里巴巴2022届应届生招聘 阿里云存储基础技术 研发&测试&算法

    学弟学妹们好 xff0c 我们是阿里云存储基础技术团队 xff0c 正在进行2022届校招 团队业务核心 xff0c 团队氛围nice xff0c 对于每位实习同学都会配师兄专职辅导 本次招聘为部门直招 xff0c 简历直接推给Leader
  • CSS3 动画效果总结

    CSS3添加了几个动画效果的属性 xff0c 通过设置这些属性 xff0c 可以做出一些简单的动画效果而不需要再去借助JavaScript CSS3动画的属性主要分为三类 xff1a transform transition以及animat
  • Javassist学习总结

    要想将编译时不存在的类在运行时动态创建并加载 xff0c 通常有两种策略 xff1a 1 动态编译 2 动态生成二进制字节码 xff08 class xff09 对于第二种策略 xff0c 实际上已经有诸多比较成熟的开源项目提供支持 xff