文档章节

JAVA ASM 生成类

y
 yan5845hao
发布于 2017/05/14 14:08
字数 511
阅读 15
收藏 0
点赞 0
评论 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
博文 119
码字总数 21349
作品 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
Android安全之---应用防dex2jar原理及实现

一、反编译某平台代码 最近在看某外卖平台的代码,发现某外卖平台最新版本版本无法正常的通过dex2jar工具将dex转换出Java源代码,在转换过程中会提示出错,如图: 查看转换出的Java源代码,会...

病已
2017/06/24
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
淘宝Tprofiler工具实现分析

项目首页:https://github.com/alibaba/TProfiler 工具介绍 TProfiler是一个可以在生产环境长期使用的性能分析工具.它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点 对...

伍咖
2015/11/14
0
0
Java深度理解——Java字节代码的操纵

导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展。但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及...

刘学炜
2012/01/13
0
0
深度探讨Java字节代码的操纵方法

本文为IBM工程师成富编写的《Java深度历险》的第一部分Java字节代码的操纵,像这样Java语言的深度理解和运用还没有很多文章,我们把他奉献给读者,希望读者们喜欢。 51CTO编者按:我们曾给大...

mj4738
2011/11/02
0
0
深入字节码 -- 使用 ASM 实现 AOP

AOP 的概念已经不是什么新鲜事物,所以我在这里就不在介绍 Aop 的概念。目前市面上要做到 Aop 是一件十分简单的事情。Spring、AspectJ、CGLib等等都可以帮助你达到目的,但是它们也只不过是一...

哈库纳
2013/09/20
0
35

没有更多内容

加载失败,请刷新页面

加载更多

下一页

win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
13分钟前
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
27分钟前
0
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expectset passwd "123456"spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/expect {"yes...

lyy549745
28分钟前
0
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
36分钟前
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
41分钟前
0
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0
nginx负载均衡

一、nginx 负载均衡 拓扑图: 主机信息: 1、负载均衡器1(lb1):192.168.10.205 RHEL7.5 2、负载均衡器2(lb2):192.168.10.206 RHEL7.5 3、web服务器1(web01):192.168.10.207 Centos...

人在艹木中
昨天
0
0
做了一个小网站

做了一个小网站 www.kanxs123.com

叶落花开
昨天
0
0
继社会佩奇之后,又尝试了可爱的蓝胖子,有趣 Python

#哆啦A梦# !/usr/bin/env python3# -*- coding: utf-8 -*-# @Author: dong dong# @Env: python 3.6from turtle import *# 无轨迹跳跃def my_goto(x, y): penup(...

Py爱好
昨天
0
0
shell及python脚本方式登录服务器

一、问题 在工作过程中,经常会遇见需要登录服务器,并且因为安全的原因,需要使用交互的方式登录,而且shell、python在工作中也经常用到,并且可以提供交互的功能。都是利用了expect、spawn...

yangjianzhou
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部