获取Java类的方法名称和变量名称

Eave 2025.03.09

ASM是一个Java字节码操纵框架。它可以直接以二进制形式动态地生成 stub 类或其他代理类,或者在装载时动态地修改类。ASM 提供类似于 BCEL 和 SERP 之类的工具包的功能,但是被设计得更小巧、更快速,这使它适用于实时代码插装。

添加Maven依赖

<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm-util</artifactId>
    <version>9.7</version>
</dependency>
package com.wizardaws.tools.application;

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.LocalVariableNode;
import org.objectweb.asm.tree.MethodNode;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.List;
import java.util.StringJoiner;

public class Asm
{
    public static void main(String[] args) throws Exception
    {
        Class clazz = Order.class;

        InputStream in = clazz.getResourceAsStream("/" + clazz.getName().replace('.', '/') + ".class");
        ClassReader cr = new ClassReader(in);
        ClassNode cn = new ClassNode();
        cr.accept(cn, ClassReader.EXPAND_FRAMES);
        List methodNodes = cn.methods;
        for(MethodNode methodNode : methodNodes)
        {
            Method[] methods = clazz.getMethods();
            // Method method = clazz.getMethod("setOrderCode", String.class);
            for(Method method : methods)
            {
                if(method.getName().equals(methodNode.name))
                {
                    System.out.println();
                    System.out.print(method.getReturnType().getSimpleName() + " " +  method.getName() + "(");
                    List localVariables = methodNode.localVariables;

                    Class[] types = method.getParameterTypes();
                    StringJoiner joiner = new StringJoiner(", ");
                    for(int i = 0; i < types.length; i++)
                    {
                        joiner.add(types[i].getSimpleName() + " " + localVariables.get(i + 1).name); // get(0) = this
                    }
                    System.out.print(joiner + ")");
                }
            }
        }
    }
}

结果输出如下:

Integer getId()
void setId(Integer id)
String getOrderCode()
void setOrderCode(String orderCode)
String getErpOrderCode()
void setErpOrderCode(String erpOrderCode)
String getCommodityCode()
void setCommodityCode(String commodityCode)
String getWarehouseCode()
void setWarehouseCode(String warehouseCode)
String getWarehouseName()
void setWarehouseName(String warehouseName)