/**********************************************************\ | | | hprose | | | | Official WebSite: http://www.hprose.com/ | | http://www.hprose.org/ | | | \**********************************************************/ /**********************************************************\ * * * ClassUtil.java * * * * Class Util class for Java. * * * * LastModified: Aug 7, 2016 * * Author: Ma Bingyao <andot@hprose.com> * * * \**********************************************************/ package net.hasor.libs.com.hprose.utils; import net.hasor.libs.com.hprose.io.HproseClassManager; import java.lang.reflect.*; import java.util.ArrayList; public final class ClassUtil { private static Class<?> getInnerClass(StringBuilder className, int[] pos, int i, char c) { if (i < pos.length) { int p = pos[i]; className.setCharAt(p, c); Class<?> type = getInnerClass(className, pos, i + 1, '_'); if (i + 1 < pos.length && type == null) { type = getInnerClass(className, pos, i + 1, '$'); } return type; } else { try { return Class.forName(className.toString()); } catch (ClassNotFoundException e) { return null; } } } public final static String getClassAlias(Class<?> type) { String className = HproseClassManager.getClassAlias(type); if (className == null) { className = type.getName().replace('.', '_').replace('$', '_'); HproseClassManager.register(type, className); } return className; } private static Class<?> getClass(StringBuilder className, int[] pos, int i, char c) { if (i < pos.length) { int p = pos[i]; className.setCharAt(p, c); Class<?> type = getClass(className, pos, i + 1, '.'); if (i + 1 < pos.length) { if (type == null) { type = getClass(className, pos, i + 1, '_'); } if (type == null) { type = getInnerClass(className, pos, i + 1, '$'); } } return type; } else { try { return Class.forName(className.toString()); } catch (ClassNotFoundException e) { return null; } } } public final static Class<?> getClass(String className) { Class<?> type = HproseClassManager.getClass(className); if (type == null) { StringBuilder cn = new StringBuilder(className); ArrayList<Integer> al = new ArrayList<Integer>(); int p = cn.indexOf("_"); while (p > -1) { al.add(p); p = cn.indexOf("_", p + 1); } if (al.size() > 0) { try { int size = al.size(); int[] pos = new int[size]; int i = -1; for (int x : al) { pos[++i] = x; } type = getClass(cn, pos, 0, '.'); if (type == null) { type = getClass(cn, pos, 0, '_'); } if (type == null) { type = getInnerClass(cn, pos, 0, '$'); } } catch (Exception e) { } } else { try { type = Class.forName(className); } catch (ClassNotFoundException e) { } } if (type == null) { type = void.class; } HproseClassManager.register(type, className); } return type; } private static Class<?> toClass(Type[] bounds) { if (bounds.length == 1) { Type boundType = bounds[0]; if (boundType instanceof Class<?>) { return (Class<?>) boundType; } } return Object.class; } public final static Class<?> toClass(Type type) { if (type == null) { return null; } else if (type instanceof Class<?>) { return (Class<?>) type; } else if (type instanceof WildcardType) { return toClass(((WildcardType) type).getUpperBounds()); } else if (type instanceof TypeVariable) { return toClass(((TypeVariable) type).getBounds()); } else if (type instanceof ParameterizedType) { return toClass(((ParameterizedType) type).getRawType()); } else if (type instanceof GenericArrayType) { return Array.newInstance(toClass(((GenericArrayType) type).getGenericComponentType()), 0).getClass(); } else { return Object.class; } } public final static Type getComponentType(Type type) { return (type instanceof GenericArrayType) ? ((GenericArrayType) type).getGenericComponentType() : (type instanceof ParameterizedType) ? ((ParameterizedType) type).getActualTypeArguments()[0] : ((Class<?>) type).isArray() ? ((Class<?>) type).getComponentType() : Object.class; } public final static Type getKeyType(Type type) { return (type instanceof ParameterizedType) ? ((ParameterizedType) type).getActualTypeArguments()[0] : Object.class; } public final static Type getValueType(Type type) { return (type instanceof ParameterizedType) ? ((ParameterizedType) type).getActualTypeArguments()[1] : Object.class; } public final static Type getActualType(Type type, Type paramType) { if ((type instanceof ParameterizedType) && (paramType instanceof TypeVariable)) { Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments(); TypeVariable[] typeParameters = ((TypeVariable) paramType).getGenericDeclaration().getTypeParameters(); int n = typeParameters.length; for (int i = 0; i < n; i++) { if (typeParameters[i].equals(paramType)) { return actualTypeArguments[i]; } } } return paramType; } }