All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.yulichang.toolkit.ClassUtils Maven / Gradle / Ivy

There is a newer version: 1.5.2
Show newest version
/*
 * Copyright (c) 2011-2022, baomidou ([email protected]).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.github.yulichang.toolkit;

import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import org.apache.ibatis.io.Resources;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.List;

/**
 * 

* ClassUtils *

* * @author Caratacus * @author HCL * @since 2017/07/08 */ @SuppressWarnings("All") public final class ClassUtils { private static ClassLoader systemClassLoader; static { try { systemClassLoader = ClassLoader.getSystemClassLoader(); } catch (SecurityException ignored) { // AccessControlException on Google App Engine } } /** * 代理 class 的名称 */ private static final List PROXY_CLASS_NAMES = Arrays.asList("net.sf.cglib.proxy.Factory" // cglib , "org.springframework.cglib.proxy.Factory" , "javassist.util.proxy.ProxyObject" // javassist , "org.apache.ibatis.javassist.util.proxy.ProxyObject"); private ClassUtils() { } /** * 判断传入的类型是否是布尔类型 * * @param type 类型 * @return 如果是原生布尔或者包装类型布尔,均返回 true */ public static boolean isBoolean(Class type) { return type == boolean.class || Boolean.class == type; } /** * 判断是否为代理对象 * * @param clazz 传入 class 对象 * @return 如果对象class是代理 class,返回 true */ public static boolean isProxy(Class clazz) { if (clazz != null) { for (Class cls : clazz.getInterfaces()) { if (PROXY_CLASS_NAMES.contains(cls.getName())) { return true; } } } return false; } /** *

* 获取当前对象的 class *

* * @param clazz 传入 * @return 如果是代理的class,返回父 class,否则返回自身 */ public static Class getUserClass(Class clazz) { Assert.notNull(clazz, "Class must not be null"); return isProxy(clazz) ? clazz.getSuperclass() : clazz; } /** *

* 获取当前对象的class *

* * @param object 对象 * @return 返回对象的 user class */ public static Class getUserClass(Object object) { Assert.notNull(object, "Instance must not be null"); return getUserClass(object.getClass()); } /** *

* 根据指定的 class , 实例化一个对象,根据构造参数来实例化 *

*

* 在 java9 及其之后的版本 Class.newInstance() 方法已被废弃 *

* * @param clazz 需要实例化的对象 * @param 类型,由输入类型决定 * @return 返回新的实例 */ public static T newInstance(Class clazz) { try { Constructor constructor = clazz.getDeclaredConstructor(); constructor.setAccessible(true); return constructor.newInstance(); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { throw ExceptionUtils.mpe("实例化对象时出现错误,请尝试给 %s 添加无参的构造方法", e, clazz.getName()); } } /** * 实例化对象. * * @param clazzName 类名 * @param 类型 * @return 实例 * @since 3.3.2 */ @SuppressWarnings("unchecked") public static T newInstance(String clazzName) { return (T) newInstance(toClassConfident(clazzName)); } /** *

* 请仅在确定类存在的情况下调用该方法 *

* * @param name 类名称 * @return 返回转换后的 Class */ public static Class toClassConfident(String name) { return toClassConfident(name, null); } /** * @param name * @param classLoader * @return * @since 3.4.3 */ public static Class toClassConfident(String name, ClassLoader classLoader) { try { return loadClass(name, getClassLoaders(classLoader)); } catch (ClassNotFoundException e) { throw ExceptionUtils.mpe("找不到指定的class!请仅在明确确定会有 class 的时候,调用该方法", e); } } private static Class loadClass(String className, ClassLoader[] classLoaders) throws ClassNotFoundException { for (ClassLoader classLoader : classLoaders) { if (classLoader != null) { try { return Class.forName(className, true, classLoader); } catch (ClassNotFoundException e) { // ignore } } } throw new ClassNotFoundException("Cannot find class: " + className); } /** * Determine the name of the package of the given class, * e.g. "java.lang" for the {@code java.lang.String} class. * * @param clazz the class * @return the package name, or the empty String if the class * is defined in the default package */ public static String getPackageName(Class clazz) { Assert.notNull(clazz, "Class must not be null"); return getPackageName(clazz.getName()); } /** * Determine the name of the package of the given fully-qualified class name, * e.g. "java.lang" for the {@code java.lang.String} class name. * * @param fqClassName the fully-qualified class name * @return the package name, or the empty String if the class * is defined in the default package */ public static String getPackageName(String fqClassName) { Assert.notNull(fqClassName, "Class name must not be null"); int lastDotIndex = fqClassName.lastIndexOf(StringPool.DOT); return (lastDotIndex != -1 ? fqClassName.substring(0, lastDotIndex) : StringPool.EMPTY); } /** * Return the default ClassLoader to use: typically the thread context * ClassLoader, if available; the ClassLoader that loaded the ClassUtils * class will be used as fallback. *

Call this method if you intend to use the thread context ClassLoader * in a scenario where you clearly prefer a non-null ClassLoader reference: * for example, for class path resource loading (but not necessarily for * {@code Class.forName}, which accepts a {@code null} ClassLoader * reference as well). * * @return the default ClassLoader (only {@code null} if even the system * ClassLoader isn't accessible) * @see Thread#getContextClassLoader() * @see ClassLoader#getSystemClassLoader() * @since 3.3.2 */ @Deprecated public static ClassLoader getDefaultClassLoader() { ClassLoader cl = null; try { cl = Thread.currentThread().getContextClassLoader(); } catch (Throwable ex) { // Cannot access thread context ClassLoader - falling back... } if (cl == null) { // No thread context class loader -> use class loader of this class. cl = ClassUtils.class.getClassLoader(); if (cl == null) { // getClassLoader() returning null indicates the bootstrap ClassLoader try { cl = ClassLoader.getSystemClassLoader(); } catch (Throwable ex) { // Cannot access system ClassLoader - oh well, maybe the caller can live with null... } } } return cl; } private static ClassLoader[] getClassLoaders(ClassLoader classLoader) { return new ClassLoader[]{ classLoader, Resources.getDefaultClassLoader(), Thread.currentThread().getContextClassLoader(), ClassUtils.class.getClassLoader(), systemClassLoader}; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy