import java.lang.reflect.Method;
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 MethodUtil {
public static String[] getAllParamaterName(Method method)
throws NotFoundException {
Class<?> clazz = method.getDeclaringClass();
ClassPool pool = ClassPool.getDefault();
CtClass clz = pool.get(clazz.getName());
CtClass[] params = new CtClass[method.getParameterTypes().length];
for (int i = 0; i < method.getParameterTypes().length; i++) {
params[i] = pool.getCtClass(method.getParameterTypes()[i].getName());
}
CtMethod cm = clz.getDeclaredMethod(method.getName(), params);
MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute
.getAttribute(LocalVariableAttribute.tag);
int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
String[] paramNames = new String[cm.getParameterTypes().length];
for (int i = 0; i < paramNames.length; i++) {
paramNames[i] = attr.variableName(i + pos);
}
return paramNames;
}
}
测试类:
import static org.junit.Assert.assertArrayEquals;
import java.lang.reflect.Method;
import org.junit.Test;
public class MethodUtilTest {
@Test
public void methodTest() throws Exception {
Method method = A.class.getMethod("test", String.class);
String[] paramaterName = MethodUtil.getAllParamaterName(method);
assertArrayEquals(paramaterName, new String[] { "name" });
}
}
测试用到的例子类
public class A {
public String test(String name) {
return name;
}
}
分享到:
相关推荐
然而,标准的Java反射API并不直接提供获取方法参数名的功能。尽管可以获取到方法的其他元数据,如方法名、返回类型、参数类型等,但参数名在默认情况下并未包含在编译后的字节码中。这是因为参数名被视为调试信息,...
在Java编程中,有时我们需要获取一个方法的参数名称,这对于日志记录、调试或动态代码生成等场景非常有用。然而,Java的常规运行时API并不直接提供这样的功能,因为参数名称在编译后的字节码中通常是不可见的。本文...
4. **性能监控**:利用Java Agent,可以对类的方法调用进行计时,收集性能数据,帮助定位性能瓶颈。 5. **动态代理**:`javassist`可以用来创建动态代理类,拦截并修改方法调用,实现事务管理、权限控制等功能。 6...
1. **类转换**:Javaassist提供了一个名为`ClassPool`的类,它是整个框架的核心,用于管理类的信息。通过`ClassPool`可以获取到Java类的字节码,甚至是从JAR文件或网络上加载类。 2. ** CtClass对象**:`CtClass`是...
Javassist是一个强大的Java字节码操作库,它允许开发者在运行时动态修改或创建类。Javassist的出现使得开发者无需深入理解底层...通过掌握Javassist,你可以更好地利用Java字节码的能力,提升代码的灵活性和可扩展性。
2. ** CtClass**:这是表示 Java 类的类,提供了丰富的 API 来访问和修改类的信息,如类名、包名、父类、接口、字段和方法。你可以通过 CtClass 实现添加、删除或修改方法体,甚至在类中插入新的字段和方法。 3. **...
为了防止这种攻击,开发者可以利用Java字节码插桩和方法挂钩技术来增强应用的安全性。本文将深入探讨这两种技术以及如何在实际应用中使用它们来检测和防止Java沙箱逃逸攻击。 字节码插桩(Bytecode instrumentation...
Java Reflection是Java提供的用于在运行时获取类、接口、方法、字段等信息的机制。在本论文中,作者利用反射机制开发了一个能够自动逆向分析Java源代码或编译后的.class文件的解析器。反射在动态语言编程中有着广泛...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和利用Java的动态性至关重要,尤其是在进行复杂系统设计、框架开发以及元数据驱动的应用中...
通过Class对象的`getMethods()`或`getDeclaredMethods()`方法可以获取类的方法信息,包括方法名、返回类型、参数类型等。 3. **Field对象**:表示类的字段。类似地,可以通过`getFields()`和`getDeclaredFields()`...
`premain`方法接收两个参数:`agentArgs`是传递给代理的自定义参数,`inst`是`Instrumentation`实例,我们可以利用它来实现我们所需的增强功能。 数据采集通常涉及对特定类或方法的监控。Java Agent可以使用`...
- 动态方法调用:反射可以用于调用未知的方法,只需在运行时知道方法名和参数类型即可。 2. **反射的性能问题**: - 开销:反射操作通常比直接的Java代码慢,因为它涉及到额外的JVM查找和安全检查。 - 编译器...
总结来说,这篇博客文章主要介绍了如何利用Java字节码操作工具Javassist来修改Cobalt Strike的源代码,特别是`common.CommonUtils`类中的`OneLiner`方法,以实现自定义的OneLiner命令。这种方法对于那些希望在Cobalt...
在这个主题中,我们将深入探讨如何利用注解实现SpringMVC的配置以及jQuery如何处理后台返回的JSON对象。 首先,让我们关注SpringMVC中的注解配置。在传统的SpringMVC应用中,我们需要在`web.xml`中声明...
以上内容总结了基于WEB的JAVA灰盒安全测试技术,包括了白盒和黑盒测试方法的局限性、灰盒测试方法的优势、Javassist字节码操作技术的应用,以及如何在J2EE中间件环境下利用hook技术进行安全漏洞检测等重要知识点。...
在这个例子中,`@Path`定义了资源路径,`@GET`指定了HTTP方法,`@PathParam`用于获取路径参数。 六、其他开源库中的注解 Java社区中有许多优秀的开源库利用注解实现了更高级的功能。比如: - Javassist和ASM:这两...
6. **Java反射**:Java反射API允许程序在运行时动态地获取类的信息(如类名、方法、属性)并操作它们,这对于测试、调试和插件系统特别有用。 7. **.exe文件**:在Windows系统中,.exe文件是可执行程序的标志,它...
### Java Struts2框架知识点详解 #### 一、Struts2框架概述 ##### 1.1 Struts2框架介绍 - **定义**:Struts2是Apache Struts的一个升级版本,是一个开源的Web应用程序框架,它实现了MVC(模型-视图-控制器)架构...
javassist-3.17.1-GA.jar是Java编程辅助工具,用于动态修改字节码,MyBatis利用它在运行时动态生成代理类,实现SQL的动态执行。cglib-2.2.2.jar是针对Java的字节码处理库,MyBatis在无法使用Java动态代理时,会使用...
2. 配置JPA:通过Java配置或XML配置文件设置数据源、实体扫描路径、事务管理器等相关参数。 3. 创建实体管理工厂:使用EntityManagerFactory的实例来创建和管理实体管理器。 4. 获取实体管理器:通过实体管理工厂...