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

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

[java] view plaincopyprint?

  1. public String concatString(String str1,String str2){
  2. return str1+str2;
  3. }
    public String concatString(String str1,String str2){
        return str1+str2;
    }

想获取"str1",和"str1"这个参数名,使用JDK自带的反射是不行的。但是我们借助第三方包
javaassist
就可以获得。

[java] view plaincopyprint?

  1. public static void main(String[] args) {
  2. Class clazz = TestJavaAssist.class;
  3. try {
  4. ClassPool pool = ClassPool.getDefault();
  5. CtClass cc = pool.get(clazz.getName());
  6. CtMethod cm = cc.getDeclaredMethod("concatString");
  7. // 使用javaassist的反射方法获取方法的参数名
  8. MethodInfo methodInfo = cm.getMethodInfo();
  9. CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
  10. LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
  11. if (attr == null) {
  12. // exception
  13. }
  14. String[] paramNames = new String[cm.getParameterTypes().length];
  15. int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
  16. for (int i = 0; i < paramNames.length; i++)
  17. paramNames[i] = attr.variableName(i + pos);
  18. // paramNames即参数名
  19. for (int i = 0; i < paramNames.length; i++) {
  20. System.out.println(paramNames[i]);
  21. }
  22. } catch (NotFoundException e) {
  23. e.printStackTrace();
  24. }
  25. }
public static void main(String[] args) {
		Class clazz = TestJavaAssist.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(paramNames[i]);
			}

		} catch (NotFoundException e) {
			e.printStackTrace();
		}
	}
时间: 2024-11-08 14:31:10

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

java如何获取方法参数名

在java中,可以通过反射获取到类.字段.方法签名等相关的信息,像方法名.返回值类型.参数类型.泛型类型参数等,但是不能够获取方法的参数名.在实际开发场景中,有时需要根据方法的参数名做一些操作,比如像spring-mvc中,@RequestParam.@PathVariable注解,如果不指定相应的value属性,默认就是使用方法的参数名做为HTTP请求的参数名,它是怎么做到的呢? 在这样情况下,有两种方法获取方法来解决这种需求,第一种方法是使用注解,在注解中指定对应应的参数名称,在需要使用参数

JAVA获取方法参数名的分析(一)

关于题目 首先解释一下题目. 我们知道, Java通过反射,可以从一个类得知它有哪些方法,有哪些变量,也可以知道每个方法中有哪几个什么类型的传入参数.但有一个东西反射取不到,那就是我们对方法传入参数的命名. 取得传入参数的名字有什么意义? 对这个问题的探究,源于在写一个测试类时候的需求.假设我们有一个类需要测试,这个类中有数十个方法.为每个方法编写测试类,将耗费大量的时间和精力.因此我有一种想法,就是通过java的反射,获得这个类所有的方法,再通过传入参数的名字和参数类型,来生成一些符合要求的数

J2SE_通过反射能获取方法参数名称吗?

一.Java通过反射可以获取方法的参数名称吗? 不能!!! 二.测试示例代码: import java.lang.reflect.Method; class T { public void print(String username) { System.out.println(username); } } public class Test { public static void main(String[] args) { T t = new T(); t.print("zhangsan&qu

java maven打包jar 方法参数名变var1,var2之类的无意义参数名怎么办

这是idea 对.class反编译的结果.要想看完整源码,可以使用maven-source-plugin,在pom.xml里配置: <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources

为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】

每篇一句 胡适:多谈些问题,少聊些主义 前言 Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用.如果你往深了一步去思考,你应该会有这样的疑问: 在使用Spring MVC的时候,你即使不使用注解,只要参数名和请求参数的key对应上了,就能自动完成数值的封装 在使用MyBatis(接口模式)时,接口方法向xml里的SQL语句传参时,必须(当然不是100%的必须,特殊情况此处不做考虑)使用@Param('')指定key值,在SQL中才可以取到 我敢相信这绝不是我一

反射之获取方法信息

本文接上文"反射之Class类的使用",以编写一个用来获取类的信息(成员函数.成员变量)的工具类来讲解"反射之获取方法信息" 1.新建工具类,命名ClassUtil,输入一个对象(Object),输出该对象的基础信息方法(printClassMessage) 1 /** 2 * 打印类的信息,成员函数.成员变量 3 * Created by Format on 2017/6/3. 4 */ 5 public class ClassUtil { 6 7 } 2.获取类

乐字节Java反射之三:方法、数组、类加载器和类的生命周期

本文承接上一篇:乐字节Java发射之二:实例化对象.接口与父类.修饰符和属性 继续讲述Java反射之三:方法.数组.类加载器 一.方法 获取所有方法(包括父类或接口),使用Method即可. public static void test() throws Exception { Class<?> clz = Class.forName("com.shsxt.ref.simple.User "); //获取属性 System.out.println("======

Java SE学习之方法参数的使用

本文是学习网络上的文章时的总结以及自己的一点实践,感谢大家无私的分享. Java程序设计语言对对象采用的不是引用调用,实际上,对象引用进行的是值传递. 在Java程序设计语言中,方法参数的使用情况: 1.一个方法不能修改一个基本数据类型的参数(即数值型和布尔型): 2.一个方法可以改变一个对象参数的状态: 3.一个方法不能实现让对象参数引用一个新的对象. 下面是测试代码 package SE; public class ParamTest { /** * <p> * </p> *

java 反射机制获取类名、属性、方法、构造器和反射动态使用

被反射的类: @Table("tb_student") public class Student { @Fields(columnName="id",type="int",length=10) private int id; @Fields(columnName="studentName",type="varchar",length=10) private String studentName; @Fiel