文档章节

JAVA ASM 生成类

y
 yan5845hao
发布于 2017/05/14 14:08
字数 511
阅读 23
收藏 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
博文 124
码字总数 22079
作品 0
扬州
程序员
私信 提问
Java 字节码工具 ASM 在 web services 开发中的应用

在基于 JAX-WS 标准的 web services 的开发中,不少实际场景都是希望采用自底向上的开发方式, 即基于已有的 Java bean 来创建 web services 。WebSphere Application Server ( 以下简称 WA...

IBMdW
2011/09/26
2K
2
关于java字节码框架ASM的学习

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

変態L
2014/01/14
0
1
动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

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

素雷
2017/10/19
0
0
关于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

没有更多内容

加载失败,请刷新页面

加载更多

JVM问题排查也不是很难--工具使用

目录 概述 环境准备 工具介绍 远程连接方式 开启JMX 工具远程连接 参考文献 概述 线上环境中,程序越来越慢,一头雾水?遇到程序经常宕机,但找不到原因?排查问题却经常记不住命令? 那是没找到好...

java_龙
8分钟前
2
0
MySQL

1、查看数据库中所有的数据表: SHOW DATABASES; 2、连接数据库: use (数据库名); 3、显示已经打开的数据库: SELECT DATABASE(); 4、创建数据表: CREATE TABLE (数据表的名字)(第...

墨冥
17分钟前
2
0
idea 设置背景色

编辑界面背景色 控制台背景色

暗中观察
18分钟前
1
0
Win10强制更新怎么关闭 彻底禁止Windows自动更新方

Win10强制更新怎么关闭 彻底禁止Windows自动更新方法 (全文) 百事数码原创 2018-07-06 17:39电脑百事网7843 + 关注 很多Win10用户来说经常会遇到这样的烦恼,电脑系统会不时的提醒自动更新,...

阿K1225
34分钟前
2
0
不用编写程序代码,送你一个爬虫程序批量采集猫眼电影票房数据

"大数据"是一个体量特别大,数据类别特别大的数据集,并且这样的数据集无法用传统数据库工具对其内容进行抓取、管理和处理。 "大数据"首先是指数据体量(volumes)大,指代大型数据集,一般在1...

技术阿飞
48分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部