`

javassist:获取方法参数名

 
阅读更多

代码如下:

 

	/*
	 * 获取方法参数名
	 */
	private String[] getMethodVariableNames(String targetClass, String targetMethodName) {
		Class<?> clazz = null;
		try {
			clazz = Class.forName(targetClass);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		ClassPool pool = ClassPool.getDefault();
		pool.insertClassPath(new ClassClassPath(clazz));
		CtClass cc;
		CtMethod cm = null;
		try {
			cc = pool.get(clazz.getName());
			cm = cc.getDeclaredMethod(targetMethodName);
		} catch (NotFoundException e) {
			e.printStackTrace();
		}

		// 使用javaassist的反射方法获取方法的参数名
		MethodInfo methodInfo = cm.getMethodInfo();
		CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
		LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
		String[] variableNames = new String[0];
		try {
			variableNames = new String[cm.getParameterTypes().length];
		} catch (NotFoundException e) {
			e.printStackTrace();
		}
		int staticIndex = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
		for (int i = 0; i < variableNames.length; i++)
			variableNames[i] = attr.variableName(i + staticIndex);
		return variableNames;
	}

 

Javassist是一个开源的分析、编辑和创建Java字节码的类库。

合理应用,极为强大,值得掌握的第三方类库。

分享到:
评论
2 楼 Night舞夜 2014-03-06  
pool.insertClassPath(new ClassClassPath(clazz)); 
这一行代码是用来做什么的,我去掉以后,还是能够正常获取方法的参数名称呢
1 楼 Night舞夜 2014-03-06  
网上找了很多的方法,感觉你这个最简便了,好用呀,
感觉try catch放在一起处理,代码感觉更清爽一些

相关推荐

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

    赠送jar包:javassist-3.21.0-GA.jar; 赠送原API文档:javassist-3.21.0-GA-javadoc.jar; 赠送源代码:javassist-3.21.0-GA-sources.jar; 赠送Maven依赖信息文件:javassist-3.21.0-GA.pom; 包含翻译后的API文档...

    Java获取代码中方法参数名信息的方法

    在这种情况下,必须依赖于`MethodParameters`或者使用其他第三方库,如`asm`或`javassist`,这些库可以在运行时解析字节码以获取参数名。 总的来说,获取Java方法的参数名涉及对字节码的理解和可能的调试信息的使用...

    agent+javassist例子

    例如,检查方法参数、返回值或副作用。 4. **性能监控**:利用Java Agent,可以对类的方法调用进行计时,收集性能数据,帮助定位性能瓶颈。 5. **动态代理**:`javassist`可以用来创建动态代理类,拦截并修改方法...

    javassistDemo

    1. **类转换**:Javaassist提供了一个名为`ClassPool`的类,它是整个框架的核心,用于管理类的信息。通过`ClassPool`可以获取到Java类的字节码,甚至是从JAR文件或网络上加载类。 2. ** CtClass对象**:`CtClass`是...

    javassist demo

    你可以指定方法的返回类型、参数类型、方法体等。Javaassist允许使用Java源代码字符串或字节码来定义方法体。 5. **修改方法**:通过`CtMethod`对象,可以修改类中已存在的方法。例如,你可以使用`setBody()`来替换...

    java实现根据方法查看方法参数名称

    要获取参数名称,我们需要借助于字节码解析库,例如ASM、BCEL或javassist。 1. ASM库:ASM是一个强大的Java字节码操控和分析框架。我们可以使用ASM的ClassReader类读取字节码,并通过MethodVisitor接口访问方法信息...

    javassist-3.15.0-GA

    3. ** CtMethod**: 用于表示和修改方法,你可以查看方法的参数、返回类型,甚至插入或替换方法体的字节码。 4. ** CtField**: 类似于 CtMethod,但用于处理字段,可以读写字段的访问修饰符和初始值。 5. ** ...

    javassist-3.18.2-GA.jar

    这些类提供了修改方法体、参数类型、返回类型等属性的方法。你可以使用注释、异常处理和本地变量来增强方法。 4. ** CtField**:表示 Java 类的字段,允许你读写字段的属性,包括类型、访问权限、初始化值等。 5. ...

    详解获取Spring MVC中所有RequestMapping以及对应方法和参数

    下面是一个示例代码,演示如何获取Spring MVC中所有的RequestMapping及其对应的方法和参数: ```java @RequestMapping(value = "/maps", produces = "application/json; charset=utf-8") @ResponseBody public ...

    Javassist-3.12

    Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码...我的项目中主要用于获取方法中的参数名。项目需要。

    java高级应用简笔

    - **`getGenericParameterTypes()`**:获取方法的所有参数类型。 - **`getReturnType()`**:获取方法的返回类型。 **3.8 ParameterizedType中的泛型操作** - **`getActualTypeArguments()`**:获取类型的实际类型...

    Javassist如何操作Java 字节码

    Javassist的出现使得开发者无需深入理解底层字节码指令就能方便地操作类、方法和字段,降低了字节码操作的难度。下面将详细介绍Javassist的主要特点、常用类以及如何使用它进行字节码操作。 一、Javassist的特点 1....

    SpringMVC纯注解配置

    5. **@RequestParam**:处理HTTP请求参数,可以获取查询参数或表单参数。 6. **@ModelAttribute**:用于将请求参数绑定到模型对象,通常用于表单数据的处理。 7. **@Autowired**:自动注入依赖,可以用于注入Bean...

    基于Java Reflection自动逆向生成类间方法关系图的解析器.zip

    通过Class对象的`getMethods()`或`getDeclaredMethods()`方法可以获取类的方法信息,包括方法名、返回类型、参数类型等。 3. **Field对象**:表示类的字段。类似地,可以通过`getFields()`和`getDeclaredFields()`...

    Java反射机制的详细讲解及实例,有助于java深度开发

    3. 调用方法:获取方法并执行,支持静态和非静态方法。 ```java Method method = clazz.getMethod("myMethod", String.class); method.invoke(obj, "参数"); // 对象方法 Method staticMethod = clazz.getMethod(...

    使用代理打印出详细的入参出参

    - 通过定义的`ParameterRef.printInputParameters`和`ParameterRef.printOutputParameters`方法可以获取方法的入参和出参的详细信息,包括参数名、参数类型和参数值,并将它们格式化为XML结构。 结合上述知识点,...

    基于Java Reflection自动逆向生成类间方法关系图的解析器.pdf

    类方法关系图的建立,需要分析出类方法的名称、包含的参数、返回类型及方法之间的相互作用。当软件出现错误时,该关系图能帮助分析和定位故障的来源,从而采取相应的应对措施。 三、逆向工程(Reverse Engineering...

    Cobal_Strike_自定义OneLiner_Evi1cg's_blog1

    8. 使用`setBody`方法替换原方法的实现,确保正确引用方法参数,注意参数引用需以`$`开头。 这个示例展示了如何扩展Cobalt Strike的OneLiner功能,使其支持更多种类的命令执行方式。通过这种方式,用户可以根据实际...

    java InvocationHandler

    `Proxy`类提供了静态方法`newProxyInstance`用于创建代理对象,它需要三个参数:一个类加载器、一个接口列表和一个`InvocationHandler`实例。 ```java Proxy.newProxyInstance( ClassLoader loader, Class[] ...

    第四课:RPC与JDBC调用拦截1

    - 参数:传递给服务的方法参数 - 用时:请求处理的耗时 - 返回结果:服务调用的返回值 - 异常信息:如有错误,包含异常信息和堆栈跟踪 - 执行状态:成功或失败等状态 - 开始时间:请求启动的时间 - 结束时间:请求...

Global site tag (gtag.js) - Google Analytics