Java方法签名的获取实例代码
本文研究的主要是Java方法签名的获取,下面是具体实现实例。
实例代码:
packagecom.yunshouhu; importjava.lang.reflect.Field; importjava.lang.reflect.Method; importjava.lang.reflect.Type; importjava.util.Collection; importcom.alibaba.fastjson.parser.DefaultJSONParser; importcom.alibaba.fastjson.parser.JSONLexer; importcom.alibaba.fastjson.parser.deserializer.ObjectDeserializer; /** *获取Java的方法签名,参考javah-jni类路径/javap-s类路径。 *@authorWuJianHua *@date2017年9月5日下午3:25:51 *@urlhttp://blog.csdn.net/earbao */ publicclassASMUtilsForJavaH{ publicstaticvoidmain(String[]args)throwsException{ 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)); Methodmethod=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)); } publicstaticBooleanisAndroid(finalStringvmName){ finalStringlowerVMName=vmName.toLowerCase(); returnlowerVMName.contains("dalvik")||lowerVMName.contains("lemur"); } publicstaticBooleanisAndroid(){ returnisAndroid(System.getProperty("java.vm.name")); } publicstaticStringgetDesc(finalMethodmethod){ finalStringBufferbuf=newStringBuffer(); buf.append("("); finalClass>[]types=method.getParameterTypes(); for(inti=0;ireturnType){ if(returnType.isPrimitive()){ returngetPrimitiveLetter(returnType); } if(returnType.isArray()){ return"["+getDesc(returnType.getComponentType()); } return"L"+getType(returnType)+";"; } publicstaticStringgetType(finalClass>parameterType){ if(parameterType.isArray()){ return"["+getDesc(parameterType.getComponentType()); } if(!parameterType.isPrimitive()){ finalStringclsName=parameterType.getName(); returnclsName.replaceAll("\\.","/"); } returngetPrimitiveLetter(parameterType); } publicstaticStringgetPrimitiveLetter(finalClass>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"; } thrownewIllegalStateException("Type:"+type.getCanonicalName()+"isnotaprimitivetype"); } publicstaticTypegetMethodType(finalClass>clazz,finalStringmethodName){ try{ finalMethodmethod=clazz.getMethod(methodName,(Class>[])newClass[0]); returnmethod.getGenericReturnType(); } catch(Exceptionex){ returnnull; } } publicstaticTypegetFieldType(finalClass>clazz,finalStringfieldName){ try{ finalFieldfield=clazz.getField(fieldName); returnfield.getGenericType(); } catch(Exceptionex){ returnnull; } } publicstaticvoidparseArray(finalCollectioncollection,finalObjectDeserializerdeser, finalDefaultJSONParserparser,finalTypetype,finalObjectfieldName){ finalJSONLexerlexer=parser.getLexer(); if(lexer.token()==8){ lexer.nextToken(16); } parser.accept(14,14); intindex=0; while(true){ finalObjectitem=deser.deserialze(parser,type,(Object)index); collection.add(item); ++index; if(lexer.token()!=16){ break; } lexer.nextToken(14); } parser.accept(15,16); } }
总结
以上就是本文关于Java方法签名的获取实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!