文档章节

JAVA ASM 生成类

y
 yan5845hao
发布于 2017/05/14 14:08
字数 511
阅读 16
收藏 0

生成类

// 生成的类名
String className = "com/uwo/resources/ui/asm/Uwo";
// 基类或父类
String superClassName = "java/lang/Object";
// 创建编译类
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
// 构建类
cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, className, null, superClassName, null);
// 结束
cw.visitEnd();
// 获取构建类的字节
byte[] b = cw.toByteArray(); 

构建字段

// 第一个设置参数是修饰符 (ACC_PUBLIC、ACC_PROTECTED、ACC_PRIVATE、ACC_FINAL、ACC_STATIC)
// 第二个设置参数是名称 
// 第三个设置参数是字段的类型 
// 第四个设置参数是字段对应于泛型
// 第五个设置参数是值
cw.visitField(Opcodes.ACC_PRIVATE, "name", Type.getDescriptor(String.class), null, null);

构建无参构造方法

// 第一个设置方法是修饰符 (ACC_PUBLIC、ACC_PROTECTED、ACC_PRIVATE)
// 第二个设置参数是名称
// 第三个设置方法描述符
// 第四个设置参数是字段对应于泛型
// 第五个设置方法抛出的异常
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC,"<init>","()V", null, null);
// 开始访问方法的代码
mv.visitCode();
// 0 表示当前对象 
mv.visitVarInsn(Opcodes.ALOAD, 0);
// 等同于super();
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, superClassName, "<init>", "()V");
// 设置返回
mv.visitInsn(Opcodes.RETURN);
// 访问最大堆栈大小和方法的局部变量的最大数量
mv.visitMaxs(0, 0);
// 访问方法的最后
mv.visitEnd();

构建有参构造方法

/**
* public Uwo(String name){
*    this.name = name;
*}
*/
MethodVisitor mv = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/lang/String;)V", null, null);
mv.visitCode();
/* start this.name = name;*/
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.PUTFIELD, className, "name", Type.getDescriptor(String.class));
/* end this.name = name;*/
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, superClassName, "<init>", "()V");
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();

构建传递父类构造

/**
* public Uwo(String name){
*    super(name);
*}
*/
MethodVisitor mv = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/lang/String;)V", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, superClassName, "<init>", "(Ljava/lang/String;)V");
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();

构建set方法

/**
* public void setName(String name){
*    this.name = name;
*}
*/
MethodVisitor mv = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "setName", "(Ljava/lang/String;)V", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.PUTFIELD, className, "name", Type.getDescriptor(String.class));
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();

构建get方法

/**
* public String getName(){
*    return this.name;
*}
*/
MethodVisitor mv = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "getName", "(Ljava/lang/String;)V", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, className, "name", Type.getDescriptor(String.class));
mv.visitInsn(Opcodes.ARETURN);
mv.visitMaxs(2, 1);
mv.visitEnd();

© 著作权归作者所有

共有 人打赏支持
y
粉丝 7
博文 120
码字总数 21437
作品 0
扬州
程序员
动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码。当前有很多开源框架可以完成这些功能,如ASM,Javassist。 动态代理机制详解(JDK 和CGLIB,Javassist,ASM...

素雷
2017/10/19
0
0
关于java字节码框架ASM的学习

一、什么是ASM   ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Jav...

変態L
2014/01/14
0
1
关于java字节码框架ASM的学习

一、什么是ASM   http://bbs.itheima.com/thread-23776-1-1.html?fstgj 以前的学习网站,-全套java视频教程,需要的自己看下,可以去这个网站下载,下载视频免费,不需要注册和做什么任务 ...

夜默
2013/06/18
0
4
AOP 的利器:ASM 3.0 介绍

引言 什么是 ASM ? ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。...

goto-array
2013/09/21
0
0
[ASM]两个比较有用的ASM工具类

org.objectweb.asm.util.ASMifierClassVisitor:分析类,并生成asm生成该类的代码, 如果自己不想了解具体的asm指令,这个类最有帮助 java -classpath asm-3.3.1.jar;asm-util-3.2.jar org.o...

eonezhang
2013/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

你为什么在Redis里读到了本应过期的数据

一个事故的故事 晚上睡的正香突然被电话吵醒,对面是开发焦急的声音:我们的程序在访问redis的时候读到了本应过期的key导致整个业务逻辑出了问题,需要马上解决。 看到这里你可能会想:这是不...

IT--小哥
今天
2
0
祝大家节日快乐,阖家幸福! centos GnuTLS 漏洞

yum update -y gnutls 修复了GnuTLS 漏洞。更新到最新 gnutls.x86_64 0:2.12.23-22.el6 版本

yizhichao
昨天
3
0
Scrapy 1.5.0之选择器

构造选择器 Scrapy选择器是通过文本(Text)或 TextResponse 对象构造的 Selector 类的实例。 它根据输入类型自动选择最佳的解析规则(XML vs HTML): >>> from scrapy.selector import Sele...

Eappo_Geng
昨天
2
0
Windows下Git多账号配置,同一电脑多个ssh-key的管理

Windows下Git多账号配置,同一电脑多个ssh-key的管理   这一篇文章是对上一篇文章《Git-TortoiseGit完整配置流程》的拓展,所以需要对上一篇文章有所了解,当然直接往下看也可以,其中也有...

morpheusWB
昨天
5
0
中秋快乐!!!

HiBlock
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部