Javaのメソッド署名の取得
4262 ワード
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);
}
}