本文研究的主要的是Java方法签名的获取、下面是具体实现实例。
实例代码:
包com.yunshouhu; 进口java.lang.reflect.Field; 进口java.lang.reflect.Method; 进口java.lang.reflect.Type; 进口java.util.Collection; 进口com.alibaba.fastjson.parser.DefaultJSONParser; 进口com.alibaba.fastjson.parser.JSONLexer; 进口com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;/* * *获取Java的方法签的名,参考javah jni类路径/javap - s类路径。 * @author WuJianHua * @date 2017年9月5日下午3:25:51 * http://blog.csdn.net/earbao */公开课ASMUtilsForJavaH { 公共静态void main (String [] args){抛出异常 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));=ASMUtilsForJavaH.class方法方法。getDeclaredMethod(“主要”,String [] . class); 系统。println (“javah jni”); System.out.println (ASMUtilsForJavaH.getDesc(方法)); System.out.println (ASMUtilsForJavaH.getType (System.class)); System.out.println (ASMUtilsForJavaH.getType (ASMUtilsForJavaH.class)); } 公共静态布尔isAndroid(最终字符串vmName) { 最终字符串lowerVMName=vmName.toLowerCase (); 返回lowerVMName.contains (dalvik) | | lowerVMName.contains(“狐猴”); } 公共静态布尔isAndroid () { 返回isAndroid (System.getProperty (“java.vm.name”); } 公共静态字符串getDesc(最终方法方法){ 最后StringBuffer buf=new StringBuffer (); buf.append (“(”); 最后Class<& # 63;在[]类型=method.getParameterTypes (); for (int i=0;我& lt;types.length;+ + i) { [我])buf.append (getDesc(类型); } buf.append (“)”); buf.append (getDesc (method.getReturnType ())); 返回buf.toString (); } 公共静态字符串getDesc(最终Class<& # 63;比;returnType) { 如果(returnType.isPrimitive ()) { 返回getPrimitiveLetter (returnType); } 如果(returnType.isArray ()) { 返回“[”+ getDesc (returnType.getComponentType ()); } 返回“L”+方法(returnType) +“;”; } 公共静态字符串方法(最终Class<& # 63;比;parameterType) { 如果(parameterType.isArray ()) { 返回“[”+ getDesc (parameterType.getComponentType ()); } 如果(! parameterType.isPrimitive ()) { 最终字符串clsName=parameterType.getName (); 返回clsName.replaceAll (“\ \”。”、“/?; } 返回getPrimitiveLetter (parameterType); } 公共静态字符串getPrimitiveLetter(最终Class<& # 63;比;类型){ 如果(Integer.TYPE.equals(类型)){ 返回“我”; } 如果(Void.TYPE.equals(类型)){ 返回“V”; } 如果(Boolean.TYPE.equals(类型)){ 返回“Z”; } 如果(Character.TYPE.equals(类型)){ 返回“C”; } 如果(byte.TYPE.equals(类型)){ 返回“B”; } 如果(short.TYPE.equals(类型)){ 返回“S”; } 如果(float.TYPE.equals(类型)){ 返回“F”; } 如果(long.TYPE.equals(类型)){ 返回“J”; } 如果(double.TYPE.equals(类型)){ 返回“D”; } 把新IllegalStateException(“类型:”+ type.getCanonicalName() +“不是原始类型”); } 公共静态类型getMethodType(最终Class<& # 63;比;clazz、最终字符串methodName) { 尝试{ 最后=clazz方法方法。getMethod (methodName (Class<& # 63;在[])新类[0]); 返回method.getGenericReturnType (); } 抓住(异常交货){ 返回null; } } 公共静态类型getFieldType(最终Class<& # 63;比;clazz、最终字符串字段名){ 尝试{=clazz.getField final字段字段(字段名); 返回field.getGenericType (); } 抓住(异常交货){ 返回null; } } 公共静态孔隙parseArray(最终收集收集,最后ObjectDeserializer des, 最后DefaultJSONParser解析器,最终类型类型,最终对象字段名){ 最后JSONLexer词法分析程序=parser.getLexer (); 如果(lexer.token ()==8) { lexer.nextToken (16); } 解析器。接受(14日14); int指数=0; 而(真){ 最终对象项=deser.deserialze(解析器、类型(对象)指数); collection.add(项); + +指数; 如果(lexer.token () !=16) { 打破; } lexer.nextToken (14); } 解析器。接受(15、16); } }Java方法签名的获取实例代码