第五篇 java字节码操作

java动态性的两种常见的实现方式:

①字节码操作

②反射

运行时操作字节码可以让我们实现如下功能:

①动态生成新的类

②动态改变某个类的结构(添加、删除、修改  新的属性或方法)

优点:

比反射的开销小,性能高

Javassist性能高于反射,低于ASM

BCEL(Byte Code Engineering Library):

是java classworking 广泛使用的一种框架,它可以让你深入JVM汇编语言进行类操作的细节。BCEL与Javassist有不同的处理字节码的方法,BCEL在实际的JVM指令层次上进行操作(BCEL拥有丰富的JVM指令级支持)而javassist所强调的是源代码级别的工作。

ASM:

是一个轻量级java字节码操作框架,直接涉及到JVM底层的操作和指令。

CGLIB(Code Generation Library):

是一个强大的,高性能,高质量的code生成类库,基于ASM实现。

javassist:

是一个开源的分析、编辑和创建java字节码的类库。性能比ASM差,与cglib差不多,但是使用简单,很多开源框架都在使用。

导入javassist.jar包:

 1 /**
 2  *
 3  * 测试使用javassist生成一个新的类
 4  *
 5  * @author Zhang XiaoDao
 6  *
 7  */
 8 public class Demo01 {
 9     public static void main(String[] args) throws Exception {
10         //获取默认的类池
11         ClassPool pool = ClassPool.getDefault();
12         //需要创建的类
13         CtClass cc = pool.makeClass("com.zzp.bean.Emp");
14
15         //创建属性,也可以给属性赋值
16         CtField f1 = CtField.make("private int empno", cc);
17         CtField f2 = CtField.make("private String ename", cc);
18         cc.addField(f1);
19         cc.addField(f2);
20
21         //创建相关的方法
22         //创建set/get方法
23         CtMethod.make("public int getEmpno(){return empno;}", cc);
24         CtMethod.make("public void setEmpno(int empno){this.empno = empno;}", cc);
25
26         CtMethod m1 = CtMethod.make("public String getEname(){return ename;}", cc);
27         CtMethod m2 = CtMethod.make("public void setEname(String ename){this.ename = ename;}", cc);
28         cc.addMethod(m1);
29         cc.addMethod(m2);
30
31         //添加构造器
32         CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")
33         },cc);
34         //设置构造器的方法体,method也能设置方法体
35         constructor.setBody("{this.empno=empno; this.ename=ename;}");
36         cc.addConstructor(constructor);
37
38         //将上面写好的类生成到桌面
39         cc.writeFile("c:/desktop");
40         System.out.println("生成类成功");
41     }
42 }

原文地址:https://www.cnblogs.com/zhangzhipeng001/p/9127762.html

时间: 2024-10-09 01:06:38

第五篇 java字节码操作的相关文章

Java字节码操作开源框架简介

avassist  Javassist是一个开源的分析.编辑和创建Java字节码的类库.是由东京技术学院的数学和计算机科学系的 Shigeru Chiba 所创建的.它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架. BCEL  Byte Code Engineering Library (BCEL),这是Apache Software Foundation 的Jakarta 项目的一部分.BCEL是 Java classwor

JAVA 字节码操作利器javassist

引用:http://blog.csdn.net/hudashi/article/details/50884742 http://blog.csdn.net/haitaofeiyang/article/details/44264685

JAVAssist字节码操作

Java动态性的两种常见实现方式 字节码操作 反射 运行时操作字节码可以让我们实现如下功能: 动态生成新的类 动态改变某个类的结构(添加/删除/修改  新的属性/方法) 优势: 比反射开销小,性能高 JAVAasist性能高于反射,低于ASM 常见的字节码操作类库 BCEL 这是Apache Software Fundation的jakarta项目的一部分.BCEL是javaclassworking广泛使用的一种跨级啊,它可以让你深入JVM汇编语言进行类的操作的细节.BCEL与javassist

深入了解 Java 字节码

1.1 什么是字节码? Java 在刚刚诞生之时曾经提出过一个非常著名的口号: "一次编写,到处运行(write once,run anywhere)",这句话充分表达了软件开发人员对冲破平台界限的渴求."与平台无关"的理想最终实现在操作系统的运用层上: 虚拟机提供商开发了许多可以运行在不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的"一次编写到处运行". 各种不同平台的虚拟机与所有平台都统一使用的程序存储格

通过Java字节码发现有趣的内幕之String篇(上)(转)

原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知识进行介绍,如果想了解更多的Java字节码或对其感兴趣的朋友可以先阅读字节码基础:JVM字节码初探. String字面量可以通过’==’判断两个字符串是否相同,是因为大家都知道’==’是用来判断两个对象的值引用地址是否一致,两个值一样的字符串字面量定义是否指向同一个值内存地址呢?答案是肯定的. 1

java字节码忍者禁术

Java语言本身是由Java语言规格说明(JLS)所定义的,而Java虚拟机的可执行字节码则是由一个完全独立的标准,即Java虚拟机规格说明(通常也被称为VMSpec)所定义的. JVM字节码是通过javac对Java源代码文件进行编译后生成的,生成的字节码与原本的Java语言存在着很大的不同.比方说,在Java语言中为人熟知的一些高级特性,在编译过程中会被移除,在字节码中完全不见踪影. 这方面最明显的一个例子莫过于Java中的各种循环关键字了(for.while等等),这些关键字在编译过程中会

用java字节码解释i++和++i

用java字节码解释i++和++i - tutuhatec的专栏 - 博客频道 - CSDN.NET 先看4个题目: ①int i = 0; i = i++; ②int i = 0; i = ++i; ③int i = 0; int j = 0; j = i++ + i++; ④ int i = 0; int j = 0; j = i++ + i++ + i++; 每道题里的i和j都是多少? 用myeclipse测试,结果分别是①i = 0,②i = 1,③i = 2,j = 1,④i = 3,

JVM(三):深入分析Java字节码-上

JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指令集都有哪些,以及其各自代表的含义.最后总结一下Class文件存在的必然性. 意义 前面说过 Java 虚拟机拥有平台无关性,但其实现在语言无关性在 JVM 和更加的体现了出来.表现就是目前越来越多的语言可以在 JVM 上运行,而这背后的逻辑,就是这些语言都会被编译为 Class 文件,然后在JVM

从零写一个编译器(十一):代码生成之Java字节码基础

项目的完整代码在 C2j-Compiler 前言 第十一篇,终于要进入代码生成部分了,但是但是在此之前,因为我们要做的是C语言到字节码的编译,所以自然要了解一些字节码,但是由于C语言比较简单,所以只需要了解一些字节码基础 JVM的基本机制 JVM有一个执行环境叫做stack frame 这个环境有两个基本数据结构 执行堆栈:指令的执行,都会围绕这个堆栈来进行 局部变量数组,参数和局部变量就存储在这个数组. 还有一个PC指针,它指向下一条要执行的指令. 举一个例子 int f(int a, int