当前位置: 首页 > 编程笔记 >

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

漆雕彦
2023-03-14
本文向大家介绍Java方法签名的获取实例代码,包括了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 方法签名,我想做java 开发的朋友也知道,方法签名的重要性,是方法重载的一个比较好的解释,尤其是在后续优化方面,这里记录下,有看到的朋友也可看下, 方法签名的意义 对于同名不同类、同类不同名的方法,方法签名的意义并不是很大,但是对于重载方法来说,方法签名的意义

  • 本文向大家介绍python获取当前运行函数名称的方法实例代码,包括了python获取当前运行函数名称的方法实例代码的使用技巧和注意事项,需要的朋友参考一下 python获取当前运行函数名称的方法实例代码 摘要: c/c++中获取函数所在源码名,函数名和行号的方法很简单 __FILE__,__FUNCTION__和__LINE__ python没有这种语法,但也可以通过某种方法得到,这里给出例子,使

  • 问题内容: 有没有一种更友好的方法来获取FontMetrics实例,而不是 由于以下示例,我讨厌这种方式: 如果要在游戏中创建菜单,并且希望所有菜单项都位于屏幕中央,则需要字体度量。但是,大多数菜单项都是可单击的。因此,我创建了一个数组,所有矩形都适合这些项目,因此当按下鼠标时,我可以简单地使用 但是要创建矩形,我还需要FontMetrics作为其坐标。因此,这意味着我必须在菜单的绘制方法中构造所

  • 本文向大家介绍java中的 toString()方法实例代码,包括了java中的 toString()方法实例代码的使用技巧和注意事项,需要的朋友参考一下 前言:       toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据。   最近项目中需要对一个ArrayList<ArrayList<Integer>> datas  形式的集合处理。   处理要求把集合数

  • 本文向大家介绍C#获取日期的星期名称实例代码,包括了C#获取日期的星期名称实例代码的使用技巧和注意事项,需要的朋友参考一下 具体代码如下所示: 使用方式: 总结 以上所述是小编给大家介绍的C#获取日期的星期名称实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 问题内容: 如果我从中创建函数的基类是派生该实例的类的基类,那么如何查找在Python中创建对象实例的类的名称? 我想也许检查模块可能在这里帮助了我,但似乎没有给我我想要的东西。除了解析__class__成员之外,我不确定如何获取此信息。 问题答案: 你是否尝试过该类的属性?即会给你班级的名字,我想这就是你想要的。 此方法仅适用于新式类。你的代码可能使用一些旧式类。这两种方法均适用: