文档章节

JAVA根据类和方法获取方法的参数列表

J
 J小新A
发布于 2016/10/26 14:51
字数 410
阅读 40
收藏 0

项目需要,想根据SpringMvc的传入地址做二次反射跳转,用java.lang.reflect包的反射机制找不到参数的具体名称,找到了@MikanMu大神的代码,稍微改造了一下,记起来以作备忘。

通过ASM来读取:

需要引入相应的jar包.

pom.xml引入:

<dependency>
    <groupId>org.ow2.asm</groupId>
	<artifactId>asm</artifactId>
	<version>5.1</version>
</dependency>

类中import:

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.Label;

 以下是实现代码:代码是抄来的:原文:http://blog.csdn.net/mhmyqn/article/details/47294485

感谢原文作者,写的很多原理性的东西很棒,不过我本地的项目引用了Spring会造成包import *不能正确识别,所以加了import,而asm也发展到6.0了,我引入的是5.1版本。


	private static String[] getMethodParameterNamesByAsm4(Class<?> clazz,
			final Method method) {
		final Class<?>[] parameterTypes = method.getParameterTypes();
		if (parameterTypes == null || parameterTypes.length == 0) {
			return null;
		}
		final Type[] types = new Type[parameterTypes.length];
		for (int i = 0; i < parameterTypes.length; i++) {
			types[i] = Type.getType(parameterTypes[i]);
		}
		final String[] parameterNames = new String[parameterTypes.length];

		String className = clazz.getName();
		int lastDotIndex = className.lastIndexOf(".");
		className = className.substring(lastDotIndex + 1) + ".class";
		InputStream is = clazz.getResourceAsStream(className);
		try {
			ClassReader classReader = new ClassReader(is);
			classReader.accept(new ClassVisitor(Opcodes.ASM4) {
				@Override
				public MethodVisitor visitMethod(int access, String name,
						String desc, String signature, String[] exceptions) {
					// 只处理指定的方法
					Type[] argumentTypes = Type.getArgumentTypes(desc);
					if (!method.getName().equals(name)
							|| !Arrays.equals(argumentTypes, types)) {
						return null;
					}
					return new MethodVisitor(Opcodes.ASM4) {
						@Override
						public void visitLocalVariable(String name,
								String desc, String signature, Label start,
								Label end, int index) {
							// 静态方法第一个参数就是方法的参数,如果是实例方法,第一个参数是this
							if (Modifier.isStatic(method.getModifiers())) {
								parameterNames[index] = name;
							} else if (index > 0) {
								parameterNames[index - 1] = name;
							}
						}
					};

				}
			}, 0);
		} catch (IOException e) {
			e.printStackTrace();
		}
        // 把参数类型和参数名组合一下,用:分割
		for (int i = 0; i < parameterNames.length; i++) {
			parameterNames[i] = parameterTypes[i].getName() + ":"
					+ parameterNames[i];
		}
		return parameterNames;
	}

 

© 著作权归作者所有

上一篇: 关注点mark
J
粉丝 8
博文 12
码字总数 4653
作品 0
锦州
私信 提问
扩展 JDT 实现自动代码注释与格式化

简介: 本文介绍了一个为 Eclipse 工作空间中的 Java 代码自动添加统一注释并格式化排版的工具及其具体实现。该工具扩展 Eclipse Java Development Tool(JDT)API,操作 Java 代码。通过本文...

红薯
2010/07/30
1K
1
「游戏引擎Mojoc」(10)Android NDK通用JNI调用Java代码封装

Mojoc提供了一个通用的工具类,来调用Android Java代码,以实现特定平台的功能。这个工具类封装了JNI使用的繁琐细和上下文对象的获取,提供了简单直接的API专注于Java类和方法的访问,并且实...

scottcgi
2018/05/20
0
0
java方法重载重写原理学习的简单总结

概述 根据查看过的 深入理解JVM 和 郑雨迪的教程,对java中方法重载的原理进行一个大致总结 具体总结 在JAVA中,多态主要体现为方法的重载和重写。 方法重载:同一个类中,方法名相同,参数列...

娑婆丶
02/18
0
0
《JVM》(四)Class类文件结构,非Class类对象的创建

Class类文件结构 class文件是一组以8字节为单位的二进制流,只有两种数据类型:无符号数(基本数据类型),表(复合数据类型) 魔数 版本号 常量池(占class空间最大的数据之一,从1开始计数...

sun_tantan
2018/07/22
0
0
阿里P8技术心得:java反射机制的核心原理

一、java的核心机制 java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection): 1、Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境,在...

Java架构
2018/11/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何使用 rsync 备份 Linux 系统的一些介绍

备份一直是 Linux 世界的热门话题。回到 2017,David Both 为 Opensource.com 的读者在使用 rsync 备份 Linux 系统方面提了一些建议,在这年的更早时候,他发起了一项问卷调查询问大家,在 ...

Linux就该这么学
18分钟前
1
0
以太坊私有链搭建

https://blog.csdn.net/Blockchain_lemon/article/details/80589123

Moks角木
56分钟前
3
0
自律给我自信-为什么要自律

为什么要自律 混一天和努力一天 看不到任何差别 3天看不到任何变化 7天也看不到任何效果 但是 1个月后, 会看到话题不同 3个月后, 会看到气场不同 6个月后, 会看到距离不同 3年后, 会看到...

周大壮
56分钟前
4
0
读书replay计划说明

突然脑袋一闪,我有了这样一个主意:通过写博客的方式,将我阅读的书中的内容replay出来。 我一般会找着我感兴趣的书去读,一般也会读书中我感兴趣的章节,或者当下对我有用的章节,所以这个...

wanxiangming
57分钟前
1
0
CentOS7安装xrdp环境可实现远程桌面访问

CentOS7安装xrdp环境可实现远程桌面访问 2018-07-14 06:39:28 分类:运维 阅读(2051) 评论(0) 在"Ubuntu系统安装xrdp桌面客户端及实现远程连接桌面"文章中有分享过在Ubuntu系统中安装XRDP环境...

linjin200
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部