package org.zbus.common.json.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Collection;
import org.zbus.common.json.parser.DefaultJSONParser;
import org.zbus.common.json.parser.JSONLexer;
import org.zbus.common.json.parser.JSONToken;
import org.zbus.common.json.parser.deserializer.ObjectDeserializer;
public class ASMUtils {
public static boolean isAndroid(String vmName) {
String lowerVMName = vmName.toLowerCase();
return lowerVMName.contains("dalvik") //
|| lowerVMName.contains("lemur") // aliyun-vm name
;
}
public static boolean isAndroid() {
return isAndroid(System.getProperty("java.vm.name"));
}
public static String getDesc(Method method) {
StringBuffer buf = new StringBuffer();
buf.append("(");
java.lang.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(Class<?> returnType) {
if (returnType.isPrimitive()) {
return getPrimitiveLetter(returnType);
} else if (returnType.isArray()) {
return "[" + getDesc(returnType.getComponentType());
} else {
return "L" + getType(returnType) + ";";
}
}
public static String getType(Class<?> parameterType) {
if (parameterType.isArray()) {
return "[" + getDesc(parameterType.getComponentType());
} else {
if (!parameterType.isPrimitive()) {
String clsName = parameterType.getName();
return clsName.replaceAll("\\.", "/");
} else {
return getPrimitiveLetter(parameterType);
}
}
}
public static String getPrimitiveLetter(Class<?> type) {
if (Integer.TYPE.equals(type)) {
return "I";
} else if (Void.TYPE.equals(type)) {
return "V";
} else if (Boolean.TYPE.equals(type)) {
return "Z";
} else if (Character.TYPE.equals(type)) {
return "C";
} else if (Byte.TYPE.equals(type)) {
return "B";
} else if (Short.TYPE.equals(type)) {
return "S";
} else if (Float.TYPE.equals(type)) {
return "F";
} else if (Long.TYPE.equals(type)) {
return "J";
} else if (Double.TYPE.equals(type)) {
return "D";
}
throw new IllegalStateException("Type: " + type.getCanonicalName() + " is not a primitive type");
}
public static Type getMethodType(Class<?> clazz, String methodName) {
try {
Method method = clazz.getMethod(methodName);
return method.getGenericReturnType();
} catch (Exception ex) {
return null;
}
}
public static Type getFieldType(Class<?> clazz, String fieldName) {
try {
Field field = clazz.getField(fieldName);
return field.getGenericType();
} catch (Exception ex) {
return null;
}
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void parseArray(Collection collection, //
ObjectDeserializer deser, //
DefaultJSONParser parser, //
Type type, //
Object fieldName) {
final JSONLexer lexer = parser.getLexer();
if (lexer.token() == JSONToken.NULL) {
lexer.nextToken(JSONToken.COMMA);
}
parser.accept(JSONToken.LBRACKET, JSONToken.LBRACKET);
int index = 0;
for (;;) {
Object item = deser.deserialze(parser, type, index);
collection.add(item);
index++;
if (lexer.token() == JSONToken.COMMA) {
lexer.nextToken(JSONToken.LBRACKET);
} else {
break;
}
}
parser.accept(JSONToken.RBRACKET, JSONToken.COMMA);
}
}