首页 > 编程 > Java > 正文

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

2019-11-26 10:16:51
字体:
来源:转载
供稿:网友

本文研究的主要是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方法签名的获取实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表