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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 胶棒没有胶枪怎么办 催泪喷雾被喷了怎么办 中了防狼喷雾怎么办 防狼喷雾喷脸上怎么办 高帮足球鞋难穿怎么办 水氟含量太高怎么办 买的自慰器太大怎么办 电棍充电器丢了怎么办 电动车连电了怎么办啊 鼻子两侧红是怎么办啊 自控力差的孩子怎么办 衣服肩膀破了洞怎么办 衣服烧了个洞怎么办 出满月黄疸没退怎么办 满月后黄疸还高怎么办 月子里的宝宝吐奶怎么办 刚满月的宝宝有点咳嗽怎么办 刚满月的咳嗽了怎么办 实木家具烫白了怎么办 木桌子烫白了怎么办 毛孔粗皮肤暗黄怎么办 脖子往右转就疼怎么办 夏天晚上热的睡不着怎么办 膝盖凉着了疼怎么办 打篮球手肿了怎么办呢 手被篮球戳肿了怎么办 手指被篮球砸了怎么办 走路久了膝盖疼怎么办 路走太多膝盖痛怎么办 走一天路膝盖疼怎么办 走多了膝盖胀痛怎么办 跑步多了膝盖疼怎么办 跑步跑得膝盖疼怎么办 脚打球崴脚淤血怎么办 打球歪了脚肿了怎么办 打球脚踝扭伤肿了怎么办 打篮球崴脚了怎么办啊 崴了脚有点疼怎么办 打球脚崴了没肿怎么办 脚歪了脚背肿了怎么办 崴脚了脚踝肿了怎么办