Java方法簽名的獲取實(shí)例代碼
更新時間:2018年02月10日 14:45:46 作者:yunshouhu
這篇文章主要介紹了Java方法簽名的獲取實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
本文研究的主要是Java方法簽名的獲取,下面是具體實(shí)現(xiàn)實(shí)例。
實(shí)例代碼:
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);
}
}
總結(jié)
以上就是本文關(guān)于Java方法簽名的獲取實(shí)例代碼的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
您可能感興趣的文章:
相關(guān)文章
Java實(shí)現(xiàn)有限狀態(tài)機(jī)的推薦方案分享
有限狀態(tài)機(jī)又稱有限狀態(tài)自動機(jī),簡稱狀態(tài)機(jī),是表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學(xué)模型,這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)有限狀態(tài)機(jī)的推薦方案,需要的朋友可以參考下2021-11-11
springboot+thymeleaf整合阿里云OOS對象存儲圖片的實(shí)現(xiàn)
本文主要介紹了springboot+thymeleaf整合阿里云OOS對象存儲圖片的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
關(guān)于spring依賴注入的方式以及優(yōu)缺點(diǎn)
這篇文章主要介紹了關(guān)于spring依賴注入的方式以及優(yōu)缺點(diǎn),依賴注入,是IOC的一個方面,是個通常的概念,它有多種解釋,這概念是說你不用創(chuàng)建對象,而只需要描述它如何被創(chuàng)建,需要的朋友可以參考下2023-07-07
SpringBoot配置Hikari數(shù)據(jù)庫連接池的詳細(xì)步驟
Spring Boot是一個開源的Java框架,它簡化了基于Spring的應(yīng)用程序的開發(fā)和部署,HikariCP是一個高性能的Java數(shù)據(jù)庫連接池,被廣泛應(yīng)用于Java開發(fā)領(lǐng)域,它是目前最快和最輕量級的連接池之一,本文介紹了SpringBoot配置Hikari數(shù)據(jù)庫連接池的詳細(xì)步驟,需要的朋友可以參考下2024-08-08

