[ASM教程]#6树API

本文介绍了如何使用ASM库通过树API创建一个Java类,包括类定义、方法添加和操作指令的遍历,同时展示了如何读取和解析自动生成的类文件。

首发于Enaium的个人博客


使用树API来生成一个类

public static void main(String[] args) {
    ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    ClassNode classNode = new ClassNode();
    classNode.visit(V1_8, ACC_PUBLIC, "cn/enaium/learn/asm/learn6/Learn6Test", null, "java/lang/Object", null);
    MethodNode methodNode = new MethodNode(ACC_PUBLIC + ACC_STATIC, "render", "()V", null, null);//一个方法
    methodNode.instructions.add(new FieldInsnNode(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"));
    methodNode.instructions.add(new LdcInsnNode("Hello ASM!"));
    methodNode.instructions.add(new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false));
    methodNode.visitMaxs(2, 1);
    methodNode.instructions.add(new InsnNode(RETURN));
    classNode.methods.add(methodNode);//添加方法
    classNode.accept(classWriter);
    String name = Learn2.class.getResource("/cn/enaium/learn/asm/learn6/").getPath() + "Learn6Test.class";

    try {
        FileOutputStream out = new FileOutputStream(name);
        out.write(classWriter.toByteArray());
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

字段或方法都在fieldsmethods里是一个列表,并且操作也是一个列表(双向链表),所以可以很容易的操作一个类。

接着再分析类。

try {
    ClassReader classReader = new ClassReader(new FileInputStream(name));
    ClassNode readClassNode = new ClassNode();
    classReader.accept(readClassNode,0);
    System.out.println(readClassNode.name);//类名
    for (MethodNode method : readClassNode.methods) {
        System.out.println(method.name);//方法名
        ListIterator<AbstractInsnNode> iterator = method.instructions.iterator();
        while (iterator.hasNext()) {
            AbstractInsnNode next = iterator.next();
            System.out.println(next.getClass());//操作
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

也可以把方法的操作给遍历出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Enaium

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值