获取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)