温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java方法签名的获取实例代码

发布时间:2020-10-11 11:38:25 来源:脚本之家 阅读:200 作者:yunshouhu 栏目:编程语言

本文研究的主要是Java方法签名的获取,下面是具体实现实例。

实例代码:

 package com.yunshouhu; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Collection; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.JSONLexer; import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; /** * 获取Java的方法签名,参考javah -jni 类路径/javap -s 类路径。 * @author WuJianHua * @date 2017年9月5日 下午3:25:51 * @url http://blog.csdn.net/earbao */ public class ASMUtilsForJavaH {	public static void main(String[] args) throws Exception {	System.out.println(ASMUtilsForJavaH.getDesc(System.class));	System.out.println(ASMUtilsForJavaH.getDesc(String.class));	System.out.println(ASMUtilsForJavaH.getDesc(Integer.class));	System.out.println(ASMUtilsForJavaH.getDesc(int.class));	Method method=ASMUtilsForJavaH.class.getDeclaredMethod("main", String[].class);	System.out.println("javah -jni");	System.out.println(ASMUtilsForJavaH.getDesc(method));	System.out.println(ASMUtilsForJavaH.getType(System.class));	System.out.println(ASMUtilsForJavaH.getType(ASMUtilsForJavaH.class));	}	public static Boolean isAndroid(final String vmName) {	final String lowerVMName = vmName.toLowerCase();	return lowerVMName.contains("dalvik") || lowerVMName.contains("lemur");	}	public static Boolean isAndroid() {	return isAndroid(System.getProperty("java.vm.name"));	}	public static String getDesc(final Method method) {	final StringBuffer buf = new StringBuffer();	buf.append("(");	final Class<?>[] types = method.getParameterTypes();	for (int i = 0; i < types.length; ++i) {	buf.append(getDesc(types[i]));	}	buf.append(")");	buf.append(getDesc(method.getReturnType()));	return buf.toString();	}	public static String getDesc(final Class<?> returnType) {	if (returnType.isPrimitive()) {	return getPrimitiveLetter(returnType);	}	if (returnType.isArray()) {	return "[" + getDesc(returnType.getComponentType());	}	return "L" + getType(returnType) + ";";	}	public static String getType(final Class<?> parameterType) {	if (parameterType.isArray()) {	return "[" + getDesc(parameterType.getComponentType());	}	if (!parameterType.isPrimitive()) {	final String clsName = parameterType.getName();	return clsName.replaceAll("\\.", "/");	}	return getPrimitiveLetter(parameterType);	}	public static String getPrimitiveLetter(final Class<?> type) {	if (Integer.TYPE.equals(type)) {	return "I";	}	if (Void.TYPE.equals(type)) {	return "V";	}	if (Boolean.TYPE.equals(type)) {	return "Z";	}	if (Character.TYPE.equals(type)) {	return "C";	}	if (byte.TYPE.equals(type)) {	return "B";	}	if (short.TYPE.equals(type)) {	return "S";	}	if (float.TYPE.equals(type)) {	return "F";	}	if (long.TYPE.equals(type)) {	return "J";	}	if (double.TYPE.equals(type)) {	return "D";	}	throw new IllegalStateException("Type: " + type.getCanonicalName() + " is not a primitive type");	}	public static Type getMethodType(final Class<?> clazz, final String methodName) {	try {	final Method method = clazz.getMethod(methodName, (Class<?>[]) new Class[0]);	return method.getGenericReturnType();	}	catch (Exception ex) {	return null;	}	}	public static Type getFieldType(final Class<?> clazz, final String fieldName) {	try {	final Field field = clazz.getField(fieldName);	return field.getGenericType();	}	catch (Exception ex) {	return null;	}	}	public static void parseArray(final Collection collection, final ObjectDeserializer deser, final DefaultJSONParser parser, final Type type, final Object fieldName) {	final JSONLexer lexer = parser.getLexer();	if (lexer.token() == 8) {	lexer.nextToken(16);	}	parser.accept(14, 14);	int index = 0;	while (true) {	final Object item = deser.deserialze(parser, type, (Object) index);	collection.add(item);	++index;	if (lexer.token() != 16) {	break;	}	lexer.nextToken(14);	}	parser.accept(15, 16);	} }

总结

以上就是本文关于Java方法签名的获取实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI