bytecode 生成器
基础 objectweb asm 很难用,找了几个高级点的。
- activej codegen 这个库很像 .net DLR 风格,采用 Expression 抽象,例如 Expressions.add(), Expressions.loop()。我发现它好几年了,这两天真正用的时候发现变量声明都搞不定。查看 nashorn 的源码,其风格也与此类似,现在 nashorn 都关闭了,如 nashorn 将此部分作为组件分享出来也是一大遗产了。
- Apache Commons BCEL] 这个库基本在手写 bytecode,太吃力了。
- javaassist,类似 codedom 的思路,生成 java 代码,借助 javac 编译为 bytecode,它把重点放到类的热插拔了
- Byte Buddy 不好用,已经忘了怎么个不好用
- cojen/Maker 最终使用的是这个,简单优雅:
ClassMaker runnableClassMaker = ClassMaker.begin().public_().implement(Runnable.class);
runnableClassMaker.addConstructor().public_();
MethodMaker runMethod = runnableClassMaker.addMethod(void.class, "run").public_();
org.cojen.maker.Variable i = runMethod.var(int.class).set(0);
org.cojen.maker.Variable j = runMethod.var(int.class).set(0);
org.cojen.maker.Variable sum = runMethod.var(int.class).set(0);
org.cojen.maker.Variable op = runMethod.var(opClass).set(runMethod.new_(opClass));
i.set(0);
Label loop1 = runMethod.label().here();
j.set(0);
Label loop2 = runMethod.label().here();
sum.inc(i.add(j));
j.inc(1);
j.ifLt(10000, loop2);
i.inc(1);
i.ifLt(10000, loop1);
runMethod.var(System.class).field("out").invoke("println", runMethod.concat("sum: ", sum));
Class<?> run = runnableClassMaker.finish();
这是一个个人作品,大量的参数类型是 object,这不是一种好的设计,但实际用的时候问题倒是不大,因为函数设计比较符合直觉。
bytecode 生成器的更多相关文章
- python(九):迭代器与生成器
一.Python的迭代协议 迭代器是访问集合内元素的一种方式.它只能依次访问集合内元素.其特点是惰性执行. collection.abc的迭代协议提供了两个概念:可迭代对象和迭代器.可迭代对象:必须具 ...
- yield 与生成器
yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭代器不一定是生成器). 如果一个函数 ...
- 介绍一款原创的四则运算算式生成器:CalculateIt2
家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- Objective-C 生成器模式 -- 简单实用和说明
1.生成器模式的定义 将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示 2.生成器模式的UML Builder :生成器接口,定义创建一个Product各个部件的操作 Con ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(25)-权限管理系统-系统管理员(附生成器)
系列目录 这一节我们要着手建立系统管理员表,但发布之前,我先发布一个代码生成器给大家先用着. 这个生成器是为这个项目而生的,理论不能用于其他项目,而且写得比较潦草,但能用 下载地址 有兴趣要生成器源码 ...
- Living in the Matrix with Bytecode Manipulation--转
原文地址:https://www.infoq.com/articles/Living-Matrix-Bytecode-Manipulation You are probably all too fam ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- ES6笔记(5)-- Generator生成器函数
系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...
- C#/ASP.NET完善的DBHelper,配套Model生成器
支持Oracle.MSSQL.MySQL.SQLite四种数据库,支持事务,支持对象关系映射:已在多个项目中实际使用. 没有语法糖,学习成本几乎为0,拿来即用. DBHelper类完整代码: usin ...
随机推荐
- .NET 跨平台工业物联网网关解决方案
前言 随着工业4.0时代的到来,物联网技术正在以前所未有的速度改变着我们的生产和生活方式.本文给大家介绍一个基于 .NET 6 开发的跨平台工业物联网网关解决方案. 工业物联网(IIoT)成为了连接物 ...
- pip下载太慢,换源
1.安装pqi pip install pqi 2.改变pip源 比如换成清华源: pqi use tuna 3.显示当前源
- python处理nii文件
第一步安装nibabel,可以使用命令:pip install nibabel 之后: from nibabel.viewers import OrthoSlicer3D as osdimport n ...
- Diffusion系列 - DDIM 公式推导 + 代码 -(三)
DENOISING DIFFUSION IMPLICIT MODELS (DDIM) 从DDPM中我们知道,其扩散过程(前向过程.或加噪过程)被定义为一个马尔可夫过程,其去噪过程(也有叫逆向过程)也是 ...
- 关于 vue3 中的 fragment 组件
vue3 中的模板中只能返回一个元素 ,否则报错,使用 fragment 组件可以返回多个元素标签
- vue 的响应式原理
首先,遍历data的数据,通过 Obejct.defineProperty 定义数据,给数据加上 geter 和 setter 函数,获取数据触发 getter函数, 修改数据时触发 setter函数 ...
- markdown.css 设置文章的样式
返回的详情文章内容是标签加内容文字,使用 markdown,css 渲染样式 : .markdown-body .octicon { display: inline-block; fill: curr ...
- KubeSphere 在 vsleem 的落地实践
作者:方忠,苏州威视通智能科技有限公司技术经理,开源技术爱好者,长期活跃于 dromara 开源社区并参与贡献. 公司介绍 公司简介 苏州威视通智能科技有限公司,是一家全球领先的全景 AI 平台提供商 ...
- 玩黑悟空要配什么显卡?ToDesk云电脑一招搞定!
近期国产游戏大作<黑神话·悟空>的预售开启,许多玩家对于如何配置自己的电脑以畅玩这款画质卓越.支持全景光追的3A大作产生了浓厚的兴趣. 尤其是显卡的选择,成为了玩家们关注的焦点.<黑 ...
- snap和apt的区别简单了解[]
Linux中没有tree命令的时候提示安装的时候出现了两个命令,简单看了看两者有何区别(一般用apt就可以了): sudo snap install tree 和 sudo apt install ...