美文网首页Java 杂谈
JAVA动态字节码

JAVA动态字节码

作者: java高级编程中心 | 来源:发表于2019-02-18 22:54 被阅读1次

BCEL 可以深入 JVM 汇编语言进行类操作的细节。 BCEL 与 javassist 有不同的处理字节码方法, BCEL 在实际的 JVM 指令层次上进行操作,而 javassist 所强调的是源代码级别的工作。

ASM

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

CGLB

基于 ASM 实现

javassist

性能低于 ASM 跟 CGLB 差不多,但是使用简单,很多开源框架都使用的是 javassist 。 javassist 比反射开销小,性能高。

小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:664389243 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!

javassist 的最外层的 API 和 JAVA 的反射包中的 API 颇为相似。它主要由 CtClass、 CtMethod 以及 CtField 几个类组成,用以执行和 JDK 反射 API 中 java.lang.Class、 java.lang.reflect.Method 、 java.lang.reflect.Field 相同的操作。

局限性

JDK5.0 新语法不支持(包括泛型、枚举),不支持注解修改

不支持数组的初始化

不支持内部类和匿名类

不支持 continue 和 break 表达式

对于继承关系,有些不支持。

maven : mvnrepository.com/artifact/ja…

反射调用方法

publicclassUser {privateString name;privateInteger age;publicvoidsum(inta,intb){intsum = a + b;        System.out.println("sum = "+ sum);    }publicstaticvoidmain(String[] args) {try{Class clz =Class.forName("javassist.User");            Object newInstance = clz.newInstance();            Method method = clz.getDeclaredMethod("sum",int.class,int.class);            Object invoke = method.invoke(newInstance,1,3);        }catch(Exception e){        }    }}复制代码

javassist 生成 class 文件

//使用javassist创建class文件ClassPool pool = ClassPool.getDefault();//创建 class 文件CtClass userClass = pool.makeClass("com.beisiji.javassist.User");//创建 id 属性CtField idField = CtField.make("private Integer id;", userClass);//创建 name 属性CtField nameField = CtField.make("private String name;", userClass);//添加属性userClass.addField(idField); userClass.addField(nameField);//创建方法CtMethod setIdMethod = CtMethod.make("public void setId(Integer id) { this.id = id; }", userClass); CtMethod getIdMethod = CtMethod.make("public Integer getId() { return id; }", userClass);//添加方法userClass.addMethod(setIdMethod); userClass.addMethod(getIdMethod);//创建构造器CtConstructor ctConstructor =newCtConstructor(newCtClass[]{CtClass.intType, pool.get("java.lang.String")}, userClass);ctConstructor.setBody("{ this.id = id;this.name = name; }");userClass.addConstructor(ctConstructor);userClass.writeFile("C:/Users/yuanl/Desktop/md_dir");复制代码

javassist 修改类文件信息

//使用javassist修改类文件信息(添加方法)ClassPool pool = ClassPool.getDefault();//需要加载的类信息(需要修改类信息的全限定名称)CtClass userClass = pool.get("executor.ExecutorDemo");//创建方法CtMethod method =newCtMethod(CtClass.intType,"add",newCtClass[]{CtClass.intType, CtClass.intType}, userClass);//设置方法权限method.setModifiers(Modifier.PUBLIC); method.setBody("{return $1 + $2;}");//$0:this , $1第一个参数 , $2第二个参数userClass.addMethod(method); userClass.writeFile("C:/Users/yuanl/Desktop/md_dir");//调用添加的方法Class clz = userClass.toClass();ObjectnewInstance = clz.newInstance(); Method addMethod = clz.getDeclaredMethod("add",int.class,int.class);Objectinvoke = addMethod.invoke(newInstance,2,3); System.out.println("invoke = "+ invoke);复制代码

小编整理了一些java进阶学习资料和面试题,需要资料的请加JAVA高阶学习Q群:664389243 这是小编创建的java高阶学习交流群,加群一起交流学习深造。群里也有小编整理的2019年最新最全的java高阶学习资料!

相关文章

  • 程序员练级攻略(2018):Java底层知识

    Java 字节码相关 首先,Java 最黑科技的玩法就是字节码编程,也就是动态修改或是动态生成 Java 字节码。...

  • 字节码注入

    Java 动态字节码技术

  • Java 动态特性二:字节码操作

    java本身动态性的两种实现方式:反射和字节码操作 字节码操作:可以实现动态生成一个类(.class文件)和动态的...

  • 字节码引用检测原理与实战

    一、字节码与引用检测 1.1 Java字节码 本章中的字节码重点研究Java 字节码,Java字节码(Java b...

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • JAVA动态字节码

    BCEL可以深入JVM汇编语言进行类操作的细节。BCEL与javassist有不同的处理字节码方法,BCEL在实际...

  • 字节码技术

    字节码技术应用场景 AOP技术、Lombok去除重复代码插件、动态修改class文件等 字节技术优势 Java字节...

  • java基础知识,字节码执行引擎

    知识要点: 函数解析 静态分派 动态分派 字节码 函数解析 虚拟机方法字节码 在Java语言中符合“编译期可知,运...

  • Java动态代理

    1、什么是动态代理 动态代理利用Java的反射技术(Java Reflection)生成字节码,在运行时创建一个实...

  • ASM框架学习(一)-基本概念

    简介 ASM是java字节码操作框架,利用该框架可以达到动态修改java运行对象代码的目的,也可以实现动态代理等功...

网友评论

    本文标题:JAVA动态字节码

    本文链接:https://www.haomeiwen.com/subject/vwltyqtx.html