`
wenjinglian
  • 浏览: 806065 次
  • 性别: Icon_minigender_1
  • 来自: 株洲->深圳
社区版块
存档分类
最新评论

javassist:增强型的java反射工具,获取方法参数名

    博客分类:
  • JAVA
阅读更多

 

java的反射是不能获取方法的参数名的。比如:

public String concatString(String param1,String param2){
        
return param1+param2;
    }

 


想获取"param1",和"param2"这个参数名,貌似是不行的。借助第三方包javaassist就可以获得。

 

整合原作者代码:

 

 

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.NotFoundException;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;

public class Test {
    public static void main(String[] args) {

        testReflectParamName();
        
    }

    /**
     * 反射获取方法参数名称
     */
    public static void testReflectParamName() {
        Class clazz = MyClass.class;
        try {
            ClassPool pool = ClassPool.getDefault();
            CtClass cc = pool.get(clazz.getName());
            CtMethod cm = cc.getDeclaredMethod("concatString");

            // 使用javaassist的反射方法获取方法的参数名
            MethodInfo methodInfo = cm.getMethodInfo();
            CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
            LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute
                    .getAttribute(LocalVariableAttribute.tag);
            if (attr == null) {
                // exception
            }
            String[] paramNames = new String[cm.getParameterTypes().length];
            int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
            for (int i = 0; i < paramNames.length; i++)
                paramNames[i] = attr.variableName(i + pos);
            // paramNames即参数名
            for (int i = 0; i < paramNames.length; i++) {
                System.out.println("参数名" + i + ":" + paramNames[i]);
            }

        } catch (NotFoundException e) {
            e.printStackTrace();
        }
    }
}

class MyClass {
    public String concatString(String param1, String param2) {
        return param1 + param2;
    }
}

 

 

反射获取参数注解:

 

 

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.Date;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.NotFoundException;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;

public class Test {
    public static void main(String[] args) {

        testReflectParamName();
        // 反射获取方法参数注解
        testReflectMethodParamAnno();
    }

    /**
     * 反射获取方法参数名称
     */
    public static void testReflectParamName() {
        Class clazz = MyClass.class;
        try {
            ClassPool pool = ClassPool.getDefault();
            CtClass cc = pool.get(clazz.getName());
            CtMethod cm = cc.getDeclaredMethod("concatString");

            // 使用javaassist的反射方法获取方法的参数名
            MethodInfo methodInfo = cm.getMethodInfo();
            CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
            LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute
                    .getAttribute(LocalVariableAttribute.tag);
            if (attr == null) {
                // exception
            }
            String[] paramNames = new String[cm.getParameterTypes().length];
            int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
            for (int i = 0; i < paramNames.length; i++)
                paramNames[i] = attr.variableName(i + pos);
            // paramNames即参数名
            for (int i = 0; i < paramNames.length; i++) {
                System.out.println("参数名" + i + ":" + paramNames[i]);
            }

        } catch (NotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 反射获取方法参数注解
     */
    public static void testReflectMethodParamAnno() {
        Class clazz = MyClass.class;
        try {
            // 使用jdk原生的反射方法
            Method m = clazz.getDeclaredMethod("datefomat",
                    new Class[] { Date.class });
            Annotation[][] annotations = m.getParameterAnnotations();
            System.out.println("jdk获取方法参数anno:"+annotations[0][0]);
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        try {
            ClassPool pool = ClassPool.getDefault();
            CtClass cc = pool.get(clazz.getName());
            CtMethod cm = cc.getDeclaredMethod("datefomat");

            // 使用javassist的反射方法可以获得参数标注值
            Object[][] annotations = cm.getParameterAnnotations();
            DateFormat myAnno = (DateFormat) annotations[0][0];
            System.out.println("参数注解:"+myAnno.value());

        } catch (NotFoundException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class MyClass {
    public String concatString(String param1, String param2) {
        return param1 + param2;
    }

    public String datefomat(@DateFormat("yyyy-MM-dd HH")
    Date date1) {
        return date1.toString();
    }
}

// 注解类
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@interface DateFormat {
    String value() default "yyyy-MM-dd";
}

 

转自:http://www.blogjava.net/Hafeyang/archive/2010/11/13/336114.html

 

 

 

分享到:
评论
1 楼 di1984HIT 2015-12-06  
学习了~~~

相关推荐

    javassist-3.23.1-GA-API文档-中英对照版.zip

    Maven坐标:org.javassist:javassist:3.23.1-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    javassist-3.24.0-GA-API文档-中文版.zip

    Maven坐标:org.javassist:javassist:3.24.0-GA; 标签:javassist、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    javassist-3.21.0-GA-API文档-中文版.zip

    Maven坐标:org.javassist:javassist:3.21.0-GA; 标签:javassist、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    javassist-3.27.0-GA-API文档-中英对照版.zip

    Maven坐标:org.javassist:javassist:3.27.0-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    javassist-3.20.0-GA-API文档-中文版.zip

    赠送jar包:javassist-3.20.0-GA.jar; 赠送原API文档:javassist-3.20.0-GA-javadoc.jar; 赠送源代码:javassist-3.20.0-GA-sources.jar; 包含翻译后的API文档:javassist-3.20.0-GA-javadoc-API文档-中文...

    javassist-3.27.0-GA.jar

    javassist-3.27.0-GA.jar

    javassist-3.12.1.GA.jar

    开源的分析、编辑和创建Java字节码的类库,加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。

    javassist-3.19.0-GA-API文档-中文版.zip

    Maven坐标:org.javassist:javassist:3.19.0-GA; 标签:javassist、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    javassist:Java字节码工程工具包

    Java字节码工程工具包 千叶茂(Shigeru Chiba)版权所有(C)1999-2020,保留所有权利。 Javassist(JAVA编程ASSISTant)使Java字节码操作变得简单。 它是一个用Java编辑字节码的类库。 它使Java程序可以在运行时...

    javassist-3.23.1-GA-API文档-中文版.zip

    Maven坐标:org.javassist:javassist:3.23.1-GA; 标签:javassist、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    开发工具 javassist-3.21.0-GA

    开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发工具 javassist-3.21.0-GA开发...

    javassist-3.18.1-GA-API文档-中文版.zip

    Maven坐标:org.javassist:javassist:3.18.1-GA; 标签:javassist、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    javassist-3.24.0-GA-API文档-中英对照版.zip

    Maven坐标:org.javassist:javassist:3.24.0-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    javassist-3.18.1-GA-API文档-中英对照版.zip

    Maven坐标:org.javassist:javassist:3.18.1-GA; 标签:javassist、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中...

    javassist-3.21.0-GA-API文档-中英对照版.zip

    Maven坐标:org.javassist:javassist:3.21.0-GA; 标签:javassist、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    javassist试图简化Java字节码的编辑

    javassist:试图简化Java字节码的编辑

    javassist-3.19.0-GA-API文档-中英对照版.zip

    Maven坐标:org.javassist:javassist:3.19.0-GA; 标签:javassist、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    javassist反射工具

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作...

    javassist反射类

    java反射的工具类,可以获得方法的参数名称

    javassist, Java字节码工程工具包.zip

    javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码

Global site tag (gtag.js) - Google Analytics