字节码操作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的更多相关文章

  1. [19/04/20-星期六] Java的动态性_字节码操作(Javassist类库(jar包),assist:帮助、援助)

    一.概念 [基本] /** * */ package cn.sxt.jvm; import javassist.ClassPool; import javassist.CtClass; import ...

  2. JAVAssist字节码操作

    Java动态性的两种常见实现方式 字节码操作 反射 运行时操作字节码可以让我们实现如下功能: 动态生成新的类 动态改变某个类的结构(添加/删除/修改  新的属性/方法) 优势: 比反射开销小,性能高 ...

  3. 关于360插件化Replugin Activity动态修改父类的字节码操作

    近期在接入360插件化方案Replugin时,发现出现崩溃情况. 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find c ...

  4. 尚学堂 216 java中的字节码操作

    所谓的字节码操作就是操作我们已经加载的字节码 接下来我们重点来讲解javaassist类库 使用需要下载jar包,把jar包添加到对应的工程之后 package com.bjsxt.test; pub ...

  5. Java动态性 字节码操作

    Java动态性的两种常见方式:-字节码操作 - 反射;字节码操作比反射开销小,性能高,JAVAasist性能高于反射,低于ASM 运行时操作字节码可是实现  : 动态生成新的类:动态的改变某个类的结构 ...

  6. Javassist 字节码操作

    1.读写字节码 Javassist是用来处理java字节码的类库.字节码保存在二进制文件中称为类文件.每个类文件夹包括一个java类或接口. Javasssist.CtClass这个类是一个类文件的抽 ...

  7. 8.5(java学习笔记)8.5 字节码操作(javassist)

    一.javassist javassist让我们操作字节码更加简单,它是一个类库,允许我们修改字节码.它允许java程序动态的创建.修改类. javassist提供了两个层次的API,基于源码级别的和 ...

  8. 字节码操作、javassist使用

    一.功能 1.动态生成新的类 2.动态改变某个类的结构(添加.删除.修改   新的属性.方法) 二.优势 1.比反射开销小,性能高 2.JAVAasist性能高于反射,低于ASM 使用javassis ...

  9. Java的动态编译、动态加载、字节码操作

    想起来之前做的一个项目:那时候是把需要的源代码通过文件流输出到一个.java文件里,然后调用sun的Comipler接口动态编译成.class文件,然后再用专门写的一个class loader加载这个 ...

随机推荐

  1. Python变量和常量

    1.什么是变量 变量:核心在于变和量儿字,变->变化,量->状态如何定义? x=1 变量名 变量赋值符号:= 变量值:1 其中变量名又称为标识符: 1. 可以是字母,数字,下划线的任意组合 ...

  2. [Java Web学习]Spring MVC使用普通类对象,声明的对象为null

    由于对Spring还不熟悉,目前还处于学习阶段,因此经常会遇到一些小白问题,这个问题需要在Spring文件中将普通对象注入bean,然后在MVC中添加set方法,填充普通对象.

  3. js cookie 操作 封装

    pCookie.js (function(){ var PotatogCookie = {}; //设置cookie PotatogCookie.set = function(key, value, ...

  4. 中间件和Django缓存

    中间件定义: 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类. 看下面的代码在settings里 ...

  5. python学习|类和实例

    什么叫实例对象呢?大家可以想象一下,[类]就像工厂的模具,以它为模板,造出来的成千上万的产品,才是被我们消费.购买.使用,真正融入我们生活的东西.这些产品,在Python中就叫[实例对象]. 往深了说 ...

  6. git 取消文件跟踪

    1.共享式忽略  git库路径下的.gitignore文件 2.独享式忽略  git库路径下的.git/info/exclude ,第一次需要自己创建exclude文件 然后将要忽略的文件名加到上面的 ...

  7. 3. Port scanners (端口扫描器 4个)

    3. Port scanners (端口扫描器 4个) 愤怒的IP扫描器是一个小的开源Java应用程序,它执行主机发现(“ping扫描”)和端口扫描. 旧的2.x版本只有Windows,但是,新的3. ...

  8. EXCEL日期格式要双击一下单元格才变正确格式

    今天遇到标题问题,问度娘后看到一个大神的解答,特此记录整理. 步骤1:在excel中把文本格式日期改为想要的日期格式 步骤2:在旁边空格中输入1,并设置成日期格式,变成1900/1/1: 步骤3:复制 ...

  9. sqlserver数据库知识点总结(转)

  10. Python之 操作 MySQL 数据库

    什么是MySQLdb? MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的. 安装 Pytho ...