欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

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

时间:2022-12-30 11:44:07|栏目:JAVA代码|点击:

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

上一篇:面试题:用 Java 逆序打印链表

栏    目:JAVA代码

下一篇:java多线程批量拆分List导入数据库的实现过程

本文标题:Java方法签名的获取实例代码

本文地址:http://www.codeinn.net/misctech/222544.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有