java反射:使用asm 获取方法的参数名
来源:互联网 发布:matlab高级编程 pdf 编辑:程序博客网 时间:2024/05/01 13:05
[Java]代码
/** * Classes.java 9:22:44 AM Apr 23, 2012 * * Copyright(c) 2000-2012 HC360.COM, All Rights Reserved. */package cn.outofmemory.demo;import java.io.IOException;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.util.Arrays;import org.objectweb.asm.ClassReader;import org.objectweb.asm.ClassVisitor;import org.objectweb.asm.Label;import org.objectweb.asm.MethodVisitor;import org.objectweb.asm.Opcodes;import org.objectweb.asm.Type;/** * <p> * 基于asm的工具类 * </p> * * @author dixingxing * @date Apr 23, 2012 */public final class Classes { private Classes() { } /** * * <p> * 比较参数类型是否一致 * </p> * * @param types * asm的类型({@link Type}) * @param clazzes * java 类型({@link Class}) * @return */ private static boolean sameType(Type[] types, Class<?>[] clazzes) { // 个数不同 if (types.length != clazzes.length) { return false; } for (int i = 0; i < types.length; i++) { if (!Type.getType(clazzes[i]).equals(types[i])) { return false; } } return true; } /** * * <p> * 获取方法的参数名 * </p> * * @param m * @return */ public static String[] getMethodParamNames(final Method m) { final String[] paramNames = new String[m.getParameterTypes().length]; final String n = m.getDeclaringClass().getName(); ClassReader cr = null; try { cr = new ClassReader(n); } catch (IOException e) { throw new RuntimeException(e); } cr.accept(new ClassVisitor(Opcodes.ASM4) { @Override public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature, final String[] exceptions) { final Type[] args = Type.getArgumentTypes(desc); // 方法名相同并且参数个数相同 if (!name.equals(m.getName()) || !sameType(args, m.getParameterTypes())) { return super.visitMethod(access, name, desc, signature, exceptions); } MethodVisitor v = super.visitMethod(access, name, desc, signature, exceptions); return new MethodVisitor(Opcodes.ASM4, v) { @Override public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { int i = index - 1; // 如果是静态方法,则第一就是参数 // 如果不是静态方法,则第一个是"this",然后才是方法的参数 if (Modifier.isStatic(m.getModifiers())) { i = index; } if (i >= 0 && i < paramNames.length) { paramNames[i] = name; } super.visitLocalVariable(name, desc, signature, start, end, index); } }; } }, 0); return paramNames; } public static void main(String[] args) throws SecurityException, NoSuchMethodException { String[] s = getMethodParamNames(Classes.class.getMethod( "getMethodParamNames", Method.class)); System.out.println(Arrays.toString(s)); s = getMethodParamNames(Classes.class.getDeclaredMethod("sameType", Type[].class, Class[].class)); System.out.println(Arrays.toString(s)); s = getMethodParamNames(MethodVisitor.class.getDeclaredMethod("visitAnnotation", String.class,Boolean.TYPE)); System.out.println(Arrays.toString(s)); // 对String,Object,thread等jdk自带类型不起作用 }}
0 0
- java反射:使用asm 获取方法的参数名
- java反射:使用asm获取方法的参数名
- javassist:增强型的java反射工具,获取方法参数名,获取方法参数标注值
- 反射获取方法名及参数名,反射获取参数作为对象使用
- javassist:增强型的java反射工具,获取方法参数名
- javassist:增强型的java反射工具,获取方法参数名
- Java中通过反射获取类的信息(方法名,参数,构造函数等)
- 获取java方法的参数名
- java反射拿到方法的参数名列表的方法
- java反射机制,通过类名获取对象,通过方法名和参数调
- java反射机制,通过类名获取对象,通过方法名和参数调
- java反射机制,通过类名获取对象,通过方法名和参数调
- Java 编程下通过反射获取一个类中的方法名和对应参数名
- Java 编程下通过反射获取一个类中的方法名和对应参数名
- java反射机制,通过类名获取对象,通过方法名和参数调
- Java 编程下通过反射获取一个类中的方法名和对应参数名
- 反射如何获取函数的参数名
- Java反射,根据类名创建带参数的实例(获取参数类型,参数等)
- Nginx学习之一——编译nginx
- 潜水员
- Linux字符界面下的鼠标操作
- 字符串加解密
- 金明的预算方案(NOIP)
- java反射:使用asm 获取方法的参数名
- 音乐的播放与停止
- Java 利用ASM读取变量值(Field value)问题研究
- npm镜像使用方法
- 最小交换合并
- 不能打开chm
- Java类编译后Class文件概述(下)
- 能量项链(NOIP)
- CSS3制作W3cplus的关注面板