Java方法簽名的獲取實(shí)例代碼
本文研究的主要是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í)例代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
- Java PDF 添加數(shù)字簽名的實(shí)現(xiàn)方法
- java遇到微信小程序 "支付驗(yàn)證簽名失敗" 問(wèn)題解決
- Java實(shí)現(xiàn)的數(shù)字簽名算法RSA完整示例
- 詳解Java數(shù)字簽名提供XML安全
- Java加密解密和數(shù)字簽名完整代碼示例
- 純Java實(shí)現(xiàn)數(shù)字證書(shū)生成簽名的簡(jiǎn)單實(shí)例
- Java將日期類型Date時(shí)間戳轉(zhuǎn)換為MongoDB的時(shí)間類型數(shù)據(jù)
- Java獲取凌晨時(shí)間戳的方法分析
- Java獲取精確到秒的時(shí)間戳方法
- Java 給PDF簽名時(shí)添加可信時(shí)間戳的方法
相關(guān)文章
SpringBoot中的404錯(cuò)誤:原因、影響及解決策略
本文詳細(xì)介紹了SpringBoot中404錯(cuò)誤的出現(xiàn)原因、影響以及處理策略,404錯(cuò)誤常見(jiàn)于URL路徑錯(cuò)誤、控制器配置問(wèn)題、靜態(tài)資源配置錯(cuò)誤、依賴缺失或版本不兼容、配置錯(cuò)誤和服務(wù)器配置問(wèn)題,解決方法包括檢查URL路徑、審查控制器配置、配置靜態(tài)資源2025-02-02
詳解JDBC的概念及獲取數(shù)據(jù)庫(kù)連接的5種方式
Java?DataBase?Connectivity是將Java與SQL結(jié)合且獨(dú)立于特定的數(shù)據(jù)庫(kù)系統(tǒng)的應(yīng)用程序編程接口,一種可用于執(zhí)行SQL語(yǔ)句的JavaAPI。本文主要介紹了JDBC的概念及獲取數(shù)據(jù)庫(kù)連接的5種方式,需要的可以參考一下2022-09-09
如何使用IntelliJ IDEA中的Live Templates自定義代碼模板
在IntelliJ IDEA中,通過(guò)使用LiveTemplates功能,可以實(shí)現(xiàn)快速編碼和自定義代碼模板,例如,輸入“main”可以自動(dòng)補(bǔ)全主函數(shù)結(jié)構(gòu),“sout”可以補(bǔ)全輸出語(yǔ)句,用戶可以通過(guò)設(shè)置中的LiveTemplates選項(xiàng)查看和定義快捷模板,支持使用分組管理和參數(shù)化模板內(nèi)容,適應(yīng)復(fù)雜的編碼需求2024-11-11
Java對(duì)象布局(JOL)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Java對(duì)象布局(JOL)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
使用注解解決ShardingJdbc不支持復(fù)雜SQL方法
這篇文章主要為大家介紹了使用注解解決ShardingJdbc不支持復(fù)雜SQL方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解
這篇文章主要為大家介紹了java代碼規(guī)范之不合理命名與重復(fù)代碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

