动态代理有几种方式,可以借助Mybatis-plus里面的检验动态类

动态代理有很多的分类;

1、JDK原生的动态代理;

2、Spring实现的基于cglib里面的工厂实例化对象;

3、基于原生的cglib造出来的对象

4、基于字节码的反编译:assistant

具体的实现类参考:


public final class ClassUtils {
    private static final char PACKAGE_SEPARATOR = '.';
    private static final List PROXY_CLASS_NAMES = Arrays.asList("net.sf.cglib.proxy.Factory", 
"org.springframework.cglib.proxy.Factory",
 "javassist.util.proxy.ProxyObject", "org.apache.ibatis.javassist.util.proxy.ProxyObject");

    private ClassUtils() {
    }

    public static boolean isProxy(Class clazz) {
        if (clazz != null) {
            Class[] var1 = clazz.getInterfaces();
            int var2 = var1.length;

            for(int var3 = 0; var3 < var2; ++var3) {
                Class cls = var1[var3];
                if (PROXY_CLASS_NAMES.contains(cls.getName())) {
                    return true;
                }
            }
        }

        return false;
    }

    public static Class getUserClass(Class clazz) {
        return isProxy(clazz) ? clazz.getSuperclass() : clazz;
    }

    public static Class getUserClass(Object object) {
        Assert.notNull(object, "Error: Instance must not be null", new Object[0]);
        return getUserClass(object.getClass());
    }

    public static  T newInstance(Class clazz) {
        try {
            Constructor constructor = clazz.getDeclaredConstructor();
            constructor.setAccessible(true);
            return constructor.newInstance();
        } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException | InstantiationException var2) {
            throw ExceptionUtils.mpe("实例化对象时出现错误,请尝试给 %s 添加无参的构造方法", var2, new Object[]{clazz.getName()});
        }
    }

    public static Class toClassConfident(String name) {
        try {
            return Class.forName(name);
        } catch (ClassNotFoundException var2) {
            throw ExceptionUtils.mpe("找不到指定的class!请仅在明确确定会有 class 的时候,调用该方法", var2, new Object[0]);
        }
    }

    public static String getPackageName(Class clazz) {
        Assert.notNull(clazz, "Class must not be null", new Object[0]);
        return getPackageName(clazz.getName());
    }

    public static String getPackageName(String fqClassName) {
        Assert.notNull(fqClassName, "Class name must not be null", new Object[0]);
        int lastDotIndex = fqClassName.lastIndexOf(46);
        return lastDotIndex != -1 ? fqClassName.substring(0, lastDotIndex) : "";
    }
}

你可能感兴趣的:(工具类,mybatis)