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