com.github.yulichang.toolkit.ClassUtils Maven / Gradle / Ivy
Show all versions of mybatis-plus-join-core Show documentation
/*
* 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};
}
}