字节码操作JAVAssist
字节码操作Javassist
字节码:字节码是设计被用来将代码高效的传送给多种软件平台、硬件平台,字节码的设计也实现了Java的平台无关性,字节码比机器码更抽象,它通常被认为是包含了一个可执行文件的二进制文件。
Javassist是一个类库用于在java中编辑字节码。它允许在程序运行时定义一个新类在JVM加载时修改类文件
面向切面编程(AOP):Javassist可以动态在一个类中增加一个新的方法,或者是在调用者或者被调用者的前(before)、后(after)、周围(around)加代码。
Reflect:
CtClass<-->java.lang.class 生成和操作类
CtMethod<-->java.lang.reflect.Method生成和操作方法
CtField<-->java.lang.reflect.Method.Field生成和操作属性。
代码实现:使用javassist实现新的类
准备工作:导入javassist.jar包
1、获得类池:方法ClassPool classpool=ClassPool.getDefault();
2、使用方法Pool.makeClass(String Str)创建类,参数是要建的类的位置以及名称
3、类具备有属性方法构造器,一个一个构建
(1) 创建属性:CtField f=CtField.make(String str,Class);第一个参数是属性的信息,第二个参数是第二步中创建的类,创建完属性之后使用类方法add()添加,如果有多个属性则应该多次使用方法。
(2) 创建方法:CtMethod m=CtMethod.make(第一个参数是方法的源码,第二个参数是第二步中创建的类)创建完方法之后使用类方法add()添加
(3) 添加构造器:CtConstructor constructor=new CtConstructor(newCtClass[]{CtClass.intType,pool.get(“java.lang.String”)},cc)
constructor.setBody(“方法体”); setBody在Method中也有 使用方法add增加到类中
(4) 写出:类.write(“工作空间”);
查看生成的类需要用到XJAD,反编译。
字节码操作JAVAssist的更多相关文章
- [19/04/20-星期六] Java的动态性_字节码操作(Javassist类库(jar包),assist:帮助、援助)
一.概念 [基本] /** * */ package cn.sxt.jvm; import javassist.ClassPool; import javassist.CtClass; import ...
- JAVAssist字节码操作
Java动态性的两种常见实现方式 字节码操作 反射 运行时操作字节码可以让我们实现如下功能: 动态生成新的类 动态改变某个类的结构(添加/删除/修改 新的属性/方法) 优势: 比反射开销小,性能高 ...
- 关于360插件化Replugin Activity动态修改父类的字节码操作
近期在接入360插件化方案Replugin时,发现出现崩溃情况. 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find c ...
- 尚学堂 216 java中的字节码操作
所谓的字节码操作就是操作我们已经加载的字节码 接下来我们重点来讲解javaassist类库 使用需要下载jar包,把jar包添加到对应的工程之后 package com.bjsxt.test; pub ...
- Java动态性 字节码操作
Java动态性的两种常见方式:-字节码操作 - 反射;字节码操作比反射开销小,性能高,JAVAasist性能高于反射,低于ASM 运行时操作字节码可是实现 : 动态生成新的类:动态的改变某个类的结构 ...
- Javassist 字节码操作
1.读写字节码 Javassist是用来处理java字节码的类库.字节码保存在二进制文件中称为类文件.每个类文件夹包括一个java类或接口. Javasssist.CtClass这个类是一个类文件的抽 ...
- 8.5(java学习笔记)8.5 字节码操作(javassist)
一.javassist javassist让我们操作字节码更加简单,它是一个类库,允许我们修改字节码.它允许java程序动态的创建.修改类. javassist提供了两个层次的API,基于源码级别的和 ...
- 字节码操作、javassist使用
一.功能 1.动态生成新的类 2.动态改变某个类的结构(添加.删除.修改 新的属性.方法) 二.优势 1.比反射开销小,性能高 2.JAVAasist性能高于反射,低于ASM 使用javassis ...
- Java的动态编译、动态加载、字节码操作
想起来之前做的一个项目:那时候是把需要的源代码通过文件流输出到一个.java文件里,然后调用sun的Comipler接口动态编译成.class文件,然后再用专门写的一个class loader加载这个 ...
随机推荐
- 关于xampp mysql字符编码与编译器编码不匹配问题
今天,在php中对数据库字符字段进行查询的时候,语法之类的完全正确,但是就是查询不到结果,而在命令行中,同样的语句却能获得预期的功效.经多方面的了解之后才发现是字符编码不匹配的原因.在这里,把我的解决 ...
- Python(四) —— 函数
什么是函数? 把一堆代码放一起就叫函数 函数用来干什么? 不复写代码,提高代码重复利用程度 怎么定义以及调用函数: def fun1(): #定义函数 print('这是一个函数') #函数体,里面什 ...
- 使用mediainfo工具统计每个视频文件(媒体文件)播放时长
需求 1.运营那边需要统计大量视频文件的播放时长,并汇总记录到excel表中,问我有什么方法搞定 这边搜索了很多统计媒体文件时长的,主要有以下几种 1.使用java获取 2.使用python获取 3. ...
- gradle 打包springboot项目,找不到项目jar application.class
如题:gradle 打包springboot项目,找不到项目jar入口main方法:application.class 检查:lib/目录下没有相应项目的jar包 用gradle命令行查看日志:gra ...
- django orm 管理器 objects
给某张表的管理器重命名 class User(models.Model): name = models.CharField(max_length=100) people = models.Manage ...
- Elisp 中变量赋值函数 set 与 setq 辨析
在 Elisp 中,为变量赋值的函数有 set 与 setq,但是,两者存在很大的差异. 使用 set 赋值: 如果我们想为变量 flowers 赋值为一个 列表 '(rose violet dais ...
- XPath定位时,使用文本的方法小技巧。
1)//td[text()= "{0}" ] #这是一种非常常用的定位方法,具体例子使用如下: __keyboard = '//td[text()= "{0}" ...
- RAMOS测速
WIN7X64-DDR31600-RAMOS测速,连续读取17GB/S,连续写入10GB/S,4K读写都是1GB/S左右.不错哦.
- LAB1 partV
partV 创建文档反向索引.word -> document 与 前面做的 单词统计类似,这个是单词与文档位置的映射关系. mapF 文档解析相同,返回信息不同而已. reduceF 返回归约 ...
- 一些常用的js循环,如for
https://blog.csdn.net/u014399368/article/details/82862444