package com.walker.security.util; //import org.springframework.lang.Nullable; //import org.springframework.util.Assert; //import org.springframework.util.CollectionUtils; //import org.springframework.util.ConcurrentReferenceHashMap; //import org.springframework.util.ReflectionUtils; //import org.springframework.util.ConcurrentReferenceHashMap; import java.beans.Introspector; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.StringJoiner; public class ClassUtils { public static final String ARRAY_SUFFIX = "[]"; private static final String INTERNAL_ARRAY_PREFIX = "["; private static final String NON_PRIMITIVE_ARRAY_PREFIX = "[L"; private static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; private static final char PACKAGE_SEPARATOR = '.'; private static final char PATH_SEPARATOR = '/'; private static final char NESTED_CLASS_SEPARATOR = '$'; public static final String CGLIB_CLASS_SEPARATOR = "$$"; public static final String CLASS_FILE_SUFFIX = ".class"; private static final Map, Class> primitiveWrapperTypeMap = new IdentityHashMap(9); private static final Map, Class> primitiveTypeToWrapperMap = new IdentityHashMap(9); private static final Map> primitiveTypeNameMap = new HashMap(32); private static final Map> commonClassCache = new HashMap(64); // private static final Set> javaLanguageInterfaces; // private static final Map interfaceMethodCache = new ConcurrentReferenceHashMap(256); public ClassUtils() { } private static void registerCommonClasses(Class... commonClasses) { Class[] var1 = commonClasses; int var2 = commonClasses.length; for(int var3 = 0; var3 < var2; ++var3) { Class clazz = var1[var3]; commonClassCache.put(clazz.getName(), clazz); } } public static ClassLoader getDefaultClassLoader() { ClassLoader cl = null; try { cl = Thread.currentThread().getContextClassLoader(); } catch (Throwable var3) { } if (cl == null) { cl = com.walker.security.util.ClassUtils.class.getClassLoader(); if (cl == null) { try { cl = ClassLoader.getSystemClassLoader(); } catch (Throwable var2) { } } } return cl; } public static ClassLoader overrideThreadContextClassLoader(ClassLoader classLoaderToUse) { Thread currentThread = Thread.currentThread(); ClassLoader threadContextClassLoader = currentThread.getContextClassLoader(); if (classLoaderToUse != null && !classLoaderToUse.equals(threadContextClassLoader)) { currentThread.setContextClassLoader(classLoaderToUse); return threadContextClassLoader; } else { return null; } } public static Class forName(String name, ClassLoader classLoader) throws ClassNotFoundException, LinkageError { Class clazz = resolvePrimitiveClassName(name); if (clazz == null) { clazz = (Class)commonClassCache.get(name); } if (clazz != null) { return clazz; } else { Class elementClass; String elementName; if (name.endsWith("[]")) { elementName = name.substring(0, name.length() - "[]".length()); elementClass = forName(elementName, classLoader); return Array.newInstance(elementClass, 0).getClass(); } else if (name.startsWith("[L") && name.endsWith(";")) { elementName = name.substring("[L".length(), name.length() - 1); elementClass = forName(elementName, classLoader); return Array.newInstance(elementClass, 0).getClass(); } else if (name.startsWith("[")) { elementName = name.substring("[".length()); elementClass = forName(elementName, classLoader); return Array.newInstance(elementClass, 0).getClass(); } else { ClassLoader clToUse = classLoader; if (classLoader == null) { clToUse = getDefaultClassLoader(); } try { return Class.forName(name, false, clToUse); } catch (ClassNotFoundException var9) { int lastDotIndex = name.lastIndexOf(46); if (lastDotIndex != -1) { String nestedClassName = name.substring(0, lastDotIndex) + '$' + name.substring(lastDotIndex + 1); try { return Class.forName(nestedClassName, false, clToUse); } catch (ClassNotFoundException var8) { } } throw var9; } } } } public static Class resolveClassName(String className, ClassLoader classLoader) throws IllegalArgumentException { try { return forName(className, classLoader); } catch (IllegalAccessError var3) { throw new IllegalStateException("Readability mismatch in inheritance hierarchy of class [" + className + "]: " + var3.getMessage(), var3); } catch (LinkageError var4) { throw new IllegalArgumentException("Unresolvable class definition for class [" + className + "]", var4); } catch (ClassNotFoundException var5) { throw new IllegalArgumentException("Could not find class [" + className + "]", var5); } } public static boolean isPresent(String className, ClassLoader classLoader) { try { forName(className, classLoader); return true; } catch (IllegalAccessError var3) { throw new IllegalStateException("Readability mismatch in inheritance hierarchy of class [" + className + "]: " + var3.getMessage(), var3); } catch (Throwable var4) { return false; } } public static boolean isVisible(Class clazz, ClassLoader classLoader) { if (classLoader == null) { return true; } else { try { if (clazz.getClassLoader() == classLoader) { return true; } } catch (SecurityException var3) { } return isLoadable(clazz, classLoader); } } public static boolean isCacheSafe(Class clazz, ClassLoader classLoader) { try { ClassLoader target = clazz.getClassLoader(); if (target == classLoader || target == null) { return true; } if (classLoader == null) { return false; } ClassLoader current = classLoader; while(current != null) { current = current.getParent(); if (current == target) { return true; } } while(target != null) { target = target.getParent(); if (target == classLoader) { return false; } } } catch (SecurityException var4) { } return classLoader != null && isLoadable(clazz, classLoader); } private static boolean isLoadable(Class clazz, ClassLoader classLoader) { try { return clazz == classLoader.loadClass(clazz.getName()); } catch (ClassNotFoundException var3) { return false; } } public static Class resolvePrimitiveClassName( String name) { Class result = null; if (name != null && name.length() <= 7) { result = (Class)primitiveTypeNameMap.get(name); } return result; } public static boolean isPrimitiveWrapper(Class clazz) { return primitiveWrapperTypeMap.containsKey(clazz); } public static boolean isPrimitiveOrWrapper(Class clazz) { return clazz.isPrimitive() || isPrimitiveWrapper(clazz); } public static boolean isPrimitiveArray(Class clazz) { return clazz.isArray() && clazz.getComponentType().isPrimitive(); } public static boolean isPrimitiveWrapperArray(Class clazz) { return clazz.isArray() && isPrimitiveWrapper(clazz.getComponentType()); } public static Class resolvePrimitiveIfNecessary(Class clazz) { return clazz.isPrimitive() && clazz != Void.TYPE ? (Class)primitiveTypeToWrapperMap.get(clazz) : clazz; } public static boolean isAssignable(Class lhsType, Class rhsType) { if (lhsType.isAssignableFrom(rhsType)) { return true; } else { Class resolvedWrapper; if (lhsType.isPrimitive()) { resolvedWrapper = (Class)primitiveWrapperTypeMap.get(rhsType); return lhsType == resolvedWrapper; } else { resolvedWrapper = (Class)primitiveTypeToWrapperMap.get(rhsType); return resolvedWrapper != null && lhsType.isAssignableFrom(resolvedWrapper); } } } public static boolean isAssignableValue(Class type, Object value) { return value != null ? isAssignable(type, value.getClass()) : !type.isPrimitive(); } public static String convertResourcePathToClassName(String resourcePath) { return resourcePath.replace('/', '.'); } public static String convertClassNameToResourcePath(String className) { // Assert.notNull(className, "Class name must not be null"); return className.replace('.', '/'); } public static String addResourcePathToPackagePath(Class clazz, String resourceName) { // Assert.notNull(resourceName, "Resource name must not be null"); return !resourceName.startsWith("/") ? classPackageAsResourcePath(clazz) + '/' + resourceName : classPackageAsResourcePath(clazz) + resourceName; } public static String classPackageAsResourcePath( Class clazz) { if (clazz == null) { return ""; } else { String className = clazz.getName(); int packageEndIndex = className.lastIndexOf(46); if (packageEndIndex == -1) { return ""; } else { String packageName = className.substring(0, packageEndIndex); return packageName.replace('.', '/'); } } } public static String classNamesToString(Class... classes) { return classNamesToString((Collection) Arrays.asList(classes)); } public static String classNamesToString( Collection> classes) { if (classes == null || classes.size() == 0) { return "[]"; } else { StringJoiner stringJoiner = new StringJoiner(", ", "[", "]"); Iterator var2 = classes.iterator(); while(var2.hasNext()) { Class clazz = (Class)var2.next(); stringJoiner.add(clazz.getName()); } return stringJoiner.toString(); } } // public static Class[] toClassArray( Collection> collection) { // return !CollectionUtils.isEmpty(collection) ? (Class[])collection.toArray(EMPTY_CLASS_ARRAY) : EMPTY_CLASS_ARRAY; // } // public static Class[] getAllInterfaces(Object instance) { // return getAllInterfacesForClass(instance.getClass()); // } // public static Class[] getAllInterfacesForClass(Class clazz) { // return getAllInterfacesForClass(clazz, (ClassLoader)null); // } // public static Class[] getAllInterfacesForClass(Class clazz, ClassLoader classLoader) { // return toClassArray(getAllInterfacesForClassAsSet(clazz, classLoader)); // } public static Set> getAllInterfacesAsSet(Object instance) { return getAllInterfacesForClassAsSet(instance.getClass()); } public static Set> getAllInterfacesForClassAsSet(Class clazz) { return getAllInterfacesForClassAsSet(clazz, (ClassLoader)null); } public static Set> getAllInterfacesForClassAsSet(Class clazz, ClassLoader classLoader) { if (clazz.isInterface() && isVisible(clazz, classLoader)) { return Collections.singleton(clazz); } else { Set> interfaces = new LinkedHashSet(); for(Class current = clazz; current != null; current = current.getSuperclass()) { Class[] ifcs = current.getInterfaces(); Class[] var5 = ifcs; int var6 = ifcs.length; for(int var7 = 0; var7 < var6; ++var7) { Class ifc = var5[var7]; if (isVisible(ifc, classLoader)) { interfaces.add(ifc); } } } return interfaces; } } public static Class createCompositeInterface(Class[] interfaces, ClassLoader classLoader) { return Proxy.getProxyClass(classLoader, interfaces); } public static Class determineCommonAncestor( Class clazz1, Class clazz2) { if (clazz1 == null) { return clazz2; } else if (clazz2 == null) { return clazz1; } else if (clazz1.isAssignableFrom(clazz2)) { return clazz1; } else if (clazz2.isAssignableFrom(clazz1)) { return clazz2; } else { Class ancestor = clazz1; do { ancestor = ancestor.getSuperclass(); if (ancestor == null || Object.class == ancestor) { return null; } } while(!ancestor.isAssignableFrom(clazz2)); return ancestor; } } // public static boolean isJavaLanguageInterface(Class ifc) { // return javaLanguageInterfaces.contains(ifc); // } public static boolean isInnerClass(Class clazz) { return clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers()); } public static boolean isLambdaClass(Class clazz) { return clazz.isSynthetic() && clazz.getSuperclass() == Object.class && clazz.getInterfaces().length > 0 && clazz.getName().contains("$$Lambda"); } /** @deprecated */ @Deprecated public static boolean isCglibProxy(Object object) { return isCglibProxyClass(object.getClass()); } /** @deprecated */ @Deprecated public static boolean isCglibProxyClass( Class clazz) { return clazz != null && isCglibProxyClassName(clazz.getName()); } /** @deprecated */ @Deprecated public static boolean isCglibProxyClassName( String className) { return className != null && className.contains("$$"); } public static Class getUserClass(Object instance) { return getUserClass(instance.getClass()); } public static Class getUserClass(Class clazz) { if (clazz.getName().contains("$$")) { Class superclass = clazz.getSuperclass(); if (superclass != null && superclass != Object.class) { return superclass; } } return clazz; } public static String getDescriptiveType( Object value) { if (value == null) { return null; } else { Class clazz = value.getClass(); if (!Proxy.isProxyClass(clazz)) { return clazz.getTypeName(); } else { String prefix = clazz.getName() + " implementing "; StringJoiner result = new StringJoiner(",", prefix, ""); Class[] var4 = clazz.getInterfaces(); int var5 = var4.length; for(int var6 = 0; var6 < var5; ++var6) { Class ifc = var4[var6]; result.add(ifc.getName()); } return result.toString(); } } } public static boolean matchesTypeName(Class clazz, String typeName) { return typeName != null && (typeName.equals(clazz.getTypeName()) || typeName.equals(clazz.getSimpleName())); } public static String getShortName(String className) { int lastDotIndex = className.lastIndexOf(46); int nameEndIndex = className.indexOf("$$"); if (nameEndIndex == -1) { nameEndIndex = className.length(); } String shortName = className.substring(lastDotIndex + 1, nameEndIndex); shortName = shortName.replace('$', '.'); return shortName; } public static String getShortName(Class clazz) { return getShortName(getQualifiedName(clazz)); } public static String getShortNameAsProperty(Class clazz) { String shortName = getShortName(clazz); int dotIndex = shortName.lastIndexOf(46); shortName = dotIndex != -1 ? shortName.substring(dotIndex + 1) : shortName; return Introspector.decapitalize(shortName); } public static String getClassFileName(Class clazz) { String className = clazz.getName(); int lastDotIndex = className.lastIndexOf(46); return className.substring(lastDotIndex + 1) + ".class"; } public static String getPackageName(Class clazz) { return getPackageName(clazz.getName()); } public static String getPackageName(String fqClassName) { int lastDotIndex = fqClassName.lastIndexOf(46); return lastDotIndex != -1 ? fqClassName.substring(0, lastDotIndex) : ""; } public static String getQualifiedName(Class clazz) { return clazz.getTypeName(); } public static String getQualifiedMethodName(Method method) { return getQualifiedMethodName(method, (Class)null); } public static String getQualifiedMethodName(Method method, Class clazz) { return (clazz != null ? clazz : method.getDeclaringClass()).getName() + '.' + method.getName(); } public static boolean hasConstructor(Class clazz, Class... paramTypes) { return getConstructorIfAvailable(clazz, paramTypes) != null; } public static Constructor getConstructorIfAvailable(Class clazz, Class... paramTypes) { try { return clazz.getConstructor(paramTypes); } catch (NoSuchMethodException var3) { return null; } } public static boolean hasMethod(Class clazz, Method method) { // Assert.notNull(clazz, "Class must not be null"); // Assert.notNull(method, "Method must not be null"); if (clazz == method.getDeclaringClass()) { return true; } else { String methodName = method.getName(); Class[] paramTypes = method.getParameterTypes(); return getMethodOrNull(clazz, methodName, paramTypes) != null; } } public static boolean hasMethod(Class clazz, String methodName, Class... paramTypes) { return getMethodIfAvailable(clazz, methodName, paramTypes) != null; } public static Method getMethod(Class clazz, String methodName, Class... paramTypes) { // Assert.notNull(clazz, "Class must not be null"); // Assert.notNull(methodName, "Method name must not be null"); if (paramTypes != null) { try { return clazz.getMethod(methodName, paramTypes); } catch (NoSuchMethodException var4) { throw new IllegalStateException("Expected method not found: " + var4); } } else { Set candidates = findMethodCandidatesByName(clazz, methodName); if (candidates.size() == 1) { return (Method)candidates.iterator().next(); } else if (candidates.isEmpty()) { throw new IllegalStateException("Expected method not found: " + clazz.getName() + '.' + methodName); } else { throw new IllegalStateException("No unique method found: " + clazz.getName() + '.' + methodName); } } } public static Method getMethodIfAvailable(Class clazz, String methodName, Class... paramTypes) { // Assert.notNull(clazz, "Class must not be null"); // Assert.notNull(methodName, "Method name must not be null"); if (paramTypes != null) { return getMethodOrNull(clazz, methodName, paramTypes); } else { Set candidates = findMethodCandidatesByName(clazz, methodName); return candidates.size() == 1 ? (Method)candidates.iterator().next() : null; } } public static int getMethodCountForName(Class clazz, String methodName) { // Assert.notNull(clazz, "Class must not be null"); // Assert.notNull(methodName, "Method name must not be null"); int count = 0; Method[] declaredMethods = clazz.getDeclaredMethods(); Method[] var4 = declaredMethods; int var5 = declaredMethods.length; int var6; for(var6 = 0; var6 < var5; ++var6) { Method method = var4[var6]; if (methodName.equals(method.getName())) { ++count; } } Class[] ifcs = clazz.getInterfaces(); Class[] var10 = ifcs; var6 = ifcs.length; for(int var11 = 0; var11 < var6; ++var11) { Class ifc = var10[var11]; count += getMethodCountForName(ifc, methodName); } if (clazz.getSuperclass() != null) { count += getMethodCountForName(clazz.getSuperclass(), methodName); } return count; } public static boolean hasAtLeastOneMethodWithName(Class clazz, String methodName) { Method[] declaredMethods = clazz.getDeclaredMethods(); Method[] var3 = declaredMethods; int var4 = declaredMethods.length; int var5; for(var5 = 0; var5 < var4; ++var5) { Method method = var3[var5]; if (method.getName().equals(methodName)) { return true; } } Class[] ifcs = clazz.getInterfaces(); Class[] var9 = ifcs; var5 = ifcs.length; for(int var10 = 0; var10 < var5; ++var10) { Class ifc = var9[var10]; if (hasAtLeastOneMethodWithName(ifc, methodName)) { return true; } } return clazz.getSuperclass() != null && hasAtLeastOneMethodWithName(clazz.getSuperclass(), methodName); } // public static Method getMostSpecificMethod(Method method, Class targetClass) { // if (targetClass != null && targetClass != method.getDeclaringClass() && isOverridable(method, targetClass)) { // try { // if (Modifier.isPublic(method.getModifiers())) { // try { // return targetClass.getMethod(method.getName(), method.getParameterTypes()); // } catch (NoSuchMethodException var3) { // return method; // } // } // // Method specificMethod = ReflectionUtils.findMethod(targetClass, method.getName(), method.getParameterTypes()); // return specificMethod != null ? specificMethod : method; // } catch (SecurityException var4) { // } // } // return method; // } // public static Method getInterfaceMethodIfPossible(Method method, Class targetClass) { // if (Modifier.isPublic(method.getModifiers()) && !method.getDeclaringClass().isInterface()) { // Method result = (Method)interfaceMethodCache.computeIfAbsent(method, (key) -> { // return findInterfaceMethodIfPossible(key, key.getDeclaringClass(), Object.class); // }); // if (result == method && targetClass != null) { // result = findInterfaceMethodIfPossible(method, targetClass, method.getDeclaringClass()); // } // // return result; // } else { // return method; // } // } private static Method findInterfaceMethodIfPossible(Method method, Class startClass, Class endClass) { for(Class current = startClass; current != null && current != endClass; current = current.getSuperclass()) { Class[] ifcs = current.getInterfaces(); Class[] var5 = ifcs; int var6 = ifcs.length; int var7 = 0; while(var7 < var6) { Class ifc = var5[var7]; try { return ifc.getMethod(method.getName(), method.getParameterTypes()); } catch (NoSuchMethodException var10) { ++var7; } } } return method; } public static boolean isUserLevelMethod(Method method) { return method.isBridge() || !method.isSynthetic() && !isGroovyObjectMethod(method); } private static boolean isGroovyObjectMethod(Method method) { return method.getDeclaringClass().getName().equals("groovy.lang.GroovyObject"); } private static boolean isOverridable(Method method, Class targetClass) { if (Modifier.isPrivate(method.getModifiers())) { return false; } else if (!Modifier.isPublic(method.getModifiers()) && !Modifier.isProtected(method.getModifiers())) { return targetClass == null || getPackageName(method.getDeclaringClass()).equals(getPackageName(targetClass)); } else { return true; } } public static Method getStaticMethod(Class clazz, String methodName, Class... args) { try { Method method = clazz.getMethod(methodName, args); return Modifier.isStatic(method.getModifiers()) ? method : null; } catch (NoSuchMethodException var4) { return null; } } private static Method getMethodOrNull(Class clazz, String methodName, Class[] paramTypes) { try { return clazz.getMethod(methodName, paramTypes); } catch (NoSuchMethodException var4) { return null; } } private static Set findMethodCandidatesByName(Class clazz, String methodName) { Set candidates = new HashSet(1); Method[] methods = clazz.getMethods(); Method[] var4 = methods; int var5 = methods.length; for(int var6 = 0; var6 < var5; ++var6) { Method method = var4[var6]; if (methodName.equals(method.getName())) { candidates.add(method); } } return candidates; } // static { // primitiveWrapperTypeMap.put(Boolean.class, Boolean.TYPE); // primitiveWrapperTypeMap.put(Byte.class, Byte.TYPE); // primitiveWrapperTypeMap.put(Character.class, Character.TYPE); // primitiveWrapperTypeMap.put(Double.class, Double.TYPE); // primitiveWrapperTypeMap.put(Float.class, Float.TYPE); // primitiveWrapperTypeMap.put(Integer.class, Integer.TYPE); // primitiveWrapperTypeMap.put(Long.class, Long.TYPE); // primitiveWrapperTypeMap.put(Short.class, Short.TYPE); // primitiveWrapperTypeMap.put(Void.class, Void.TYPE); // Iterator var0 = primitiveWrapperTypeMap.entrySet().iterator(); // // while(var0.hasNext()) { // Map.Entry, Class> entry = (Map.Entry)var0.next(); // primitiveTypeToWrapperMap.put(entry.getValue(), entry.getKey()); // registerCommonClasses((Class)entry.getKey()); // } // // Set> primitiveTypes = new HashSet(32); // primitiveTypes.addAll(primitiveWrapperTypeMap.values()); // Collections.addAll(primitiveTypes, new Class[]{boolean[].class, byte[].class, char[].class, double[].class, float[].class, int[].class, long[].class, short[].class}); // Iterator var4 = primitiveTypes.iterator(); // // while(var4.hasNext()) { // Class primitiveType = (Class)var4.next(); // primitiveTypeNameMap.put(primitiveType.getName(), primitiveType); // } // // registerCommonClasses(Boolean[].class, Byte[].class, Character[].class, Double[].class, Float[].class, Integer[].class, Long[].class, Short[].class); // registerCommonClasses(Number.class, Number[].class, String.class, String[].class, Class.class, Class[].class, Object.class, Object[].class); // registerCommonClasses(Throwable.class, Exception.class, RuntimeException.class, Error.class, StackTraceElement.class, StackTraceElement[].class); // registerCommonClasses(Enum.class, Iterable.class, Iterator.class, Enumeration.class, Collection.class, List.class, Set.class, Map.class, Map.Entry.class, Optional.class); // Class[] javaLanguageInterfaceArray = new Class[]{Serializable.class, Externalizable.class, Closeable.class, AutoCloseable.class, Cloneable.class, Comparable.class}; // registerCommonClasses(javaLanguageInterfaceArray); // javaLanguageInterfaces = new HashSet(Arrays.asList(javaLanguageInterfaceArray)); // } }