首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Asm字节码生成器生成具有泛型类型的方法(ClassWriter)

使用Asm字节码生成器生成具有泛型类型的方法(ClassWriter)

Asm字节码生成器是一个Java库,它可以用于生成、修改和分析Java字节码。使用Asm字节码生成器,可以在运行时动态地生成具有泛型类型的方法。

以下是一个使用Asm字节码生成器生成具有泛型类型的方法的示例:

代码语言:java
复制
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

public class GenericMethodGenerator {

    public static byte[] generate() {
        ClassWriter cw = new ClassWriter(0);
        cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "GenericMethodGenerator", null, "java/lang/Object", null);

        MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "genericMethod", "(Ljava/util/List<Ljava/lang/String;>;)V", null, null);
        mv.visitCode();
        mv.visitVarInsn(Opcodes.ALOAD, 1);
        mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "size", "()I", true);
        mv.visitVarInsn(Opcodes.ISTORE, 2);
        mv.visitInsn(Opcodes.RETURN);
        mv.visitMaxs(1, 3);
        mv.visitEnd();

        cw.visitEnd();
        return cw.toByteArray();
    }
}

在这个示例中,我们使用Asm字节码生成器生成了一个名为GenericMethodGenerator的类,该类具有一个名为genericMethod的方法。该方法接受一个泛型类型为java.lang.Stringjava.util.List作为参数,并返回void。

在方法中,我们使用visitMethodInsn方法调用java.util.List接口的size方法,并将结果存储在局部变量中。最后,我们使用RETURN指令返回。

生成的字节码可以通过调用toByteArray方法获取,并可以使用Java类加载器动态地加载到JVM中。

总之,使用Asm字节码生成器可以方便地生成具有泛型类型的方法,从而实现动态生成和修改Java类的功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

类、方法类型通配符使用

类、方法类型通配符使用 一.类        声明和非声明类似,除了在类名后面添加了类型参数声明部分...和方法一样,类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个参数,也被称为一个类型变量,是用于指定一个类型名称标识符。...下面是定义方法规则: 所有方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中)。...类型参数能被用来声明返回值类型,并且能作为方法得到实际参数类型占位符。 方法声明和其他方法一样。...下面的例子演示了"extends"如何使用在一般意义上意思"extends"(类)或者"implements"(接口)。该例子中方法返回三个可比较对象最大值。

3.8K40

ASM 字节增强

字节增强 字节增强技术就是一类对现有字节进行修改或者动态生成全新字节文件技术。...以下是一些常见 Java 字节类库: ASM (Bytecode Manipulation Framework): 简介:ASM 是一个轻量级字节操作框架,提供了生成和转换字节功能。...ASM Core API ASM Core API 使用流式方式根据字节结构从上到下依次处理,性能很好,所以一般 ASM 增强字节一般都使用 Core API。...* 通过调用 MethodVisitor visitXXXXInsn() 方法就可以实现字节插入,XXXX 对应相应操作助记符类型, * 比如 mv.visitLdcInsn(“end..."Ljava/lang/String;", // 字段描述符,表示字段类型。 null, // 字段签名,用于类型

36810
  • 【JAVA】不会有人不知道 Java 类能够在运行时动态生成吧?

    第一步,生成对应类,其实和我们去写 Java 代码很类似,只不过改为用 ASM 方法和指定参数,代替了我们书写源码。...// 方法名称 "()Ljava/lang/Object;", // 描述符 null, // 签名,null表示不是...// 结束类字节生成 上面的代码虽然有些晦涩,但总体还是能多少理解其用意,不同 visitX 方法提供了创建类型,创建各种方法等逻辑。...ASM API,广泛使用了 Visitor 模式,如果你熟悉这个模式,就会知道它所针对场景是将算法和对象结构解耦,非常适合字节操纵场合,因为我们大部分情况都是依赖于特定结构修改或者添加新方法、...按照前面的分析,字节操作最后大都应该是生成 byte 数组,ClassWriter 提供了一个简便方法

    44720

    Java 字节操作框架——ASM

    那个时候包含 java.lang.reflect.Proxy 包 JDK 1.3 还没发布,ASM 被作为代码生成器,用来生成动态代理代理类。...,例如 cglib,、mybatis、fastjson 其它字节操作框架在操作字节过程中生成大量中间类和对象,耗费大量内存且运行缓慢,ASM 使用了访问者(Visitor)设计模式,避免了创建和消耗大量中间变量...ClassWriter 这个类是 ClassVisitor 抽象类一个实现类,其之前每个 ClassVisitor 都可能对原始字节做修改,ClassWriter toByteArray 方法则把最终修改字节以...ClassVisitor 对象调用不同 visit 方法,ClassVisitor 可以在这些 visit 方法中对字节进行修改,ClassWriter 可以生成最终修改过自己字节。.../MyMain2.class"), bytesModified); 使用 javap 查看 MyMain2 字节,可以看到已经多了一个类型为String xyz 变量了。

    39020

    2.2 ASM-类-接口和组件

    第二个参数是属性名称,和源码中是一样。第三个参数制定了属性类型使用类型描述符方式。 这里指定属性是int类型,所以类型描述符是I。 第四个参数是。...在这个示例中是null,因为我们没有使用。 最后一个参数是该属性常量值:这个参数只有在属性是恒定常量时候才会被使用,即静态final属性。对于其他非静态常量,该参数必须为null。...调用visitMethod方法定义compareTo方法。这里第一个参数同样是设置方法修饰符。 第二个参数指定了方法名称,和源码中一样。第三个是该方法描述符。第四个参数对应方法。...在我们示例中是null,因为定义方法没有使用。 最后一个参数指定了可能被该方法抛出exception数组,使用内部名格式。这里是null,因为该方法不抛出任何异常。...如果你编写一个动态代理类生成器或者aspect weaver(切面织入器),需要使用ClassLoader。

    1.3K10

    Android必备:ASM字节操作

    ASM全称为“Java字节操作框架(Java Bytecode Manipulation Framework)”,它是一个用于生成和转换Java字节框架。...它可以让你在运行时动态地生成、修改和转换Java字节,可以做到诸如在类加载时动态修改字节,或者在执行过程中动态生成类等等。...ASM使用场景 ASM可以用在很多场景中,比如: 代码注入 AOP(面向切面编程) 动态代理 字节加密和混淆 动态生成类和方法 除此之外,ASM还可以用来做性能优化。...使用ASM进行字节加密和混淆 使用ASM可以对字节进行加密和混淆,增强代码安全性。可以通过修改常量池、修改方法名和字段名等方式来达到加密和混淆效果。...使用ASM动态生成类和方法 使用ASM可以动态生成类和方法,这是动态代理、AOP等功能基础。可以使用ASM生成类,继承已有的类或者实现指定接口,具备与原类相似的功能。

    65721

    教你用Java字节做日志脱敏工具

    1 Instrumentation 上一篇字节也能做有趣事之ASM教你了如何去修改字节?...相信看过同学已经对如何修改字节已经有一定印象了,但是这里有个问题,上一节我们是通过读取.class文件在内存里面使用,并不能影响我们实际jvm中使用class。...* @param generic * @param defaultValue 默认值 * @return */ @Override public...2.3做完之后思考 用字节做一个工具,的确学到了很多,至少以后对看懂字节,看懂一些Java对语法糖处理有很大帮助,但是这个工具不是很通用,打个jar包出来,你需要配置agent或者你用attach...同时ASM作用不仅仅是和instrument搭配,大家可以看看cglib切面的源码,或者看看fastjson源码,你可以根据jvm中已经加载好类,然后修改其字节修改成新其他类,这里可以是代理类

    1.6K61

    ASM字节编程 | 如果你只写CRUD,那这种技术栈你永远碰不到!!!

    目录: 一、前言二、环境配置三、工程信息四、HelloWorld还可以这样写五、有插件帮助字节开发也不是很难六、用字节写出一个两数之和计算七、在原有方法字节增强监控耗时八、字节控制打印方法入参...^1024”,其实以上代码都是来自于 ASM 框架代码,这里面所有的操作与我们使用使用 javap -c XXX 所反解析出字节是一样,只不过是反过来使用指令来编写代码。...五、有插件帮助字节开发也不是很难 对于新人来说如果用字节增强开发一些东西确实挺难,尤其是一些复杂代码块使用字节指令操作还是很有难度。那么,其实也是有简单办法就是使用 ASM 插件。...} } 使用字节编程方式实现 import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import...此时我们是调用了新字节类,同时还将字节输出方便我们查看生成 class 类。 七、在原有方法字节增强监控耗时 到这我们基本了解到通过字节编程,可以动态生成一个类。

    53820

    ASM字节编程 | 如果你只写CRUD,那这种技术栈你永远碰不到!!!

    itstack-demo-asm-02:字节编程,两数之和 itstack-demo-asm-03:字节增强,输出入参 itstack-demo-asm-04:字节增强,调用外部方法 以上源码可以通过关注公众号...^1024”,其实以上代码都是来自于 ASM 框架代码,这里面所有的操作与我们使用使用 javap -c XXX 所反解析出字节是一样,只不过是反过来使用指令来编写代码。...五、有插件帮助字节开发也不是很难 对于新人来说如果用字节增强开发一些东西确实挺难,尤其是一些复杂代码块使用字节指令操作还是很有难度。那么,其实也是有简单办法就是使用 ASM 插件。...} } 使用字节编程方式实现 import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import...此时我们是调用了新字节类,同时还将字节输出方便我们查看生成 class类。 七、在原有方法字节增强监控耗时 到这我们基本了解到通过字节编程,可以动态生成一个类。

    2.5K40

    java asm 框架 浅析

    而这里说到asm是指objectweb asm,一种.class代码生成器开源项目.  ...ASM是一套java字节生成架构,它可以动态生成二进制格式stub类或其它代理类,   或者在类被java虚拟机装入内存之前,动态修改类。  ...现在挺多流行框架都使用到了asm.所以从aop追溯来到了这。   1.什么是ObjectWeb ASM       ObjectWeb ASM是轻量级Java字节处理框架。...在我看来,ObjectWeb ASM具有如下几个非常诱人特点       * 小巧、高效       * 源代码实现非常简洁而又优雅,简直就是Gof《设计模式》非常棒注解       * 字节控制...实现         我们看看使用ObjectWeb ASM如何实现我们上面描述功能         1)ObjectWeb ASM字节修改      1.

    1.2K90

    Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)「建议收藏」

    JVM虚拟机读取字节文件,取出二进制数据,加载到内存中,解析.class 文件内信息,生成对应 Class对象: class字节文件是根据JVM虚拟机规范中规定字节组织规则生成...在运行时期可以按照Java虚拟机规范对class文件组织规则生成对应二进制字节。当前有很多开源框架可以完成这些功能,如ASM,Javassist。...Java字节生成开源框架介绍–ASMASM 是一个 Java 字节操控框架。它能够以二进制形式修改已有类或者动态生成类。...不过ASM在创建class字节过程中,操纵级别是底层JVM汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定了解。...cglib 创建某个类A动态代理类模式是: 1. 查找A上所有非final public类型方法定义; 2. 将这些方法定义转换成字节; 3.

    58821

    字节也能做有趣事之ASM

    0.写在前面 本篇是本系列第二篇,主要介绍什么是ASM,以及如何使用ASM。 如果没有阅读之前,还请阅读一下字节也能做有趣事,因为需要上一章部分知识。...1.什么是ASM 在上节我们知道,通过javac编译生成之后生成字节,但是我们可能会有一些需求,比如需要AOP切面,事务统一管理,有些重复代码需要我们来回敲,又或者我们需要生成自己字节使用...而这里我要介绍就是操作字节一把利器-ASMASM是一个java字节操纵框架,它能被用来动态生成类或者增强既有类功能。...,甚至可以生成字节文件。...上面说了ClassVisitor,这里再说说其他Visitor,ASM core api里代码是根据字节从上到下依次生成,可以看见里面还有一些其他Visitor,比如MethodVisitor,

    1.2K51

    调研字节插桩技术,用于系统监控设计和实现

    ---- 接下来我们开始介绍关于使用字节插桩非入侵方式进行系统监控,关于字节插桩常用有三个组件,包括:ASM、Javassit、Byte-Buddy,接下来我们分别介绍它们是如何使用。...(); // 生成字节数组 return classWriter.toByteArray(); } 以上这段代码就是基于 ASM 编写 HelloWorld,整个过程包括:定义一个类生成...ASM 核心类 ClassReader、ClassWriter、ClassVisitor,处理传入进行类加载器、类名、字节等,负责字节增强操作。...此处主要是关于 ASM 操作类,ClassReader、ClassWriter、ClassVisitor,关于字节编程文章:ASM、Javassist、Byte-bu 系列文章 5.字节方法解析...在一些全链路监控中组件中 Javassist 使用非常多,它即可使用编码方式操作字节增强,也可以像 ASM 那样进行处理。

    1.1K40

    你们单测覆盖率是如何统计?原理是什么?

    具体见下表: 工具 Jacoco Emma Cobertura 原理 使用 ASM 修改字节 修改 jar 文件,class 文件字节文件 基于 jcoverage,基于 asm 框架对 class...解析字节,识别需要进行插桩代码区域(如方法、循环、异常处理等)。 插入额外字节,通常通过编写Java代码来实现这一步,然后利用字节生成库(如ASM、Javassist等)生成相应字节。...将修改后字节重新写回到磁盘或内存中,以供后续使用。 假设我们希望对一个Java方法进行性能监控,我们可以在方法入口和出口处分别插入计时器,以统计方法执行时间。...具体实现可借助字节生成ASM或Javassist来实现,此处以ASM为例。...以下代码展示了如何使用ASM对Example类进行字节插桩: import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor

    26510

    ASM初探

    在对象模型下 ASM 有 两类操作纬度,分别如下所示: 1)、获取节点:获取指定类、字段、方法节点。 2)、操控操作(针对方法节点):获取操作码位置、替换、删除、插入操作、输出字节。...,这时 ASM使用 ClassReader 来解析字节。...,就可以使用 ASM ClassWriter 类来输出字节**,代码如下所示: ```java // 1、让 ClassWriter 自行计算最大栈深度和栈映射帧等信息 ClassWriter...2)、ClassWriter:用于重新构建编译后类,如修改类名、属性以及方法,也可以生成字节文件。...在使用 ASM 进行插桩时候,我们尤其需要注意以下 两点: 1)、当我们使用 ASM 处理字节时,需要 逐步小量修改、验证,切记不要编写大量字节并希望它们能够立即通过验证并且可以马上执行。

    1.4K10

    2.3 ASM-类-工具类

    生成器和适配器非常有用,但在程序运行中不是必需。...ASM同样也提供了一个在程序运行时,处理内部名、类型描述符和方法描述符工具类。 所有工具都会在下面进行介绍。 ?...2.3.1 类型 正如前面章节介绍ASMAPI展示Java类型,像编译后class中一样,即使用内部名、类型描述符。 使用源码中展示方式,可以使代码更加易读。...这样,为了得到实际生成类可读性描述,可以使用TraceClassVisitor代替ClassWriter。 或者,更胜一筹是同时使用这两个类。...例如,如果不知道如何使用ASM生成一个编译后class,你可以直接编写该类源码,使用javac编译,最后使用ASMifier访问编译后class。 就可以得到该编译类使用ASM生成代码了。

    91620

    Java 动态字节技术

    动态生成字节 我们知道,我们编写 Java 代码都是要被编译成字节后才能放到 JVM 里执行,而字节一旦被加载到虚拟机中,就可以被解释执行。...Java 生态里有很多可以动态生成字节技术,像 BCEL、Javassist、ASM、CGLib 等,它们各有自己优势。有的使用复杂却功能强大、有的简单确也性能些差。... 即可以右侧工具栏查看我们要生成字节。...常用方法ASM 代码实现里,最明显就是访问者模式,ASM 将对代码读取和操作都包装成一个访问者,在解析 JVM 加载到字节时调用。...它唯一一个 transform() 方法会在类文件被加载时调用,在 transform 方法里,我们可以对传入二进制字节进行改写或替换,生成字节码数组后返回,JVM 会使用 transform

    2K20

    Java字节增强探秘

    图16 字节增强技术 2.1 ASM 对于需要手动操纵字节需求,可以使用ASM,它可以直接生成.class字节文件,也可以在类被加载入JVM之前动态修改类行为(如下图17所示)。...ClassWriter:用于重新构建编译后类,如修改类名、属性以及方法,也可以生成字节文件。...这期间并不涉及到JVM运行时对类重加载,而是在第一个Main方法中,通过ASM对已编译类字节进行替换,在第二个Main方法中,直接使用已替换好新类信息。...接口中transform()方法会在类文件被加载时调用,而在Transform方法里,我们可以利用上文中ASM或Javassist对传入字节进行改写或替换,生成字节码数组后返回。...此外,我们平时使用动态代理、AOP也与字节增强密切相关,它们实质上还是利用各种手段生成符合规范字节文件。

    1.9K51

    如何实现IDEA debug?

    动态生成字节 我们知道,我们编写 Java 代码都是要被编译成字节后才能放到 JVM 里执行,而字节一旦被加载到虚拟机中,就可以被解释执行。...Java 生态里有很多可以动态生成字节技术,像 BCEL、Javassist、ASM、CGLib 等,它们各有自己优势。有的使用复杂却功能强大、有的简单确也性能些差。...即可以右侧工具栏查看我们要生成字节。...常用方法ASM 代码实现里,最明显就是访问者模式,ASM 将对代码读取和操作都包装成一个访问者,在解析 JVM 加载到字节时调用。...它唯一一个 transform() 方法会在类文件被加载时调用,在 transform 方法里,我们可以对传入二进制字节进行改写或替换,生成字节码数组后返回,JVM 会使用 transform

    31320

    3.2 ASM-方法-接口和组件

    除了一些注解和调试相关信息(这些信息将在下一章说明),这个类定义了每个字节指令类别一个方法,根据这些指令参数数量和参数类型(这些类别不对应3.1.2节介绍那些类别)。...3.2.2 生成方法 Generating methods 在3.1.3章中定义‘getF’方法字节,可以通过下面的方法调用生成(mv是一个MethodVisitor对象): mv.visitCode...紧跟着三个调用生成了这个方法三条指令(如你所见,字节ASM API之间映射非常简单明了)。 ‘visitMaxs’方法,必须在所有指令方法调用之后调用。...‘setF’方法和构造函数也可以使用相同方法生成字节。...实现该转换思路,我们可以编译这两个类,使用‘TraceClassVisitor’输出两个编译类字节,并进行比较(可以使用Textifier,或者使用ASMifier)。

    2K10
    领券