動態代理有很多的分類;
1、JDK原生的動態代理;
2、Spring實現的基于cglib里面的工廠實例化對象;
3、基于原生的cglib造出來的對象
4、基于字節碼的反編譯:assistant
具體的實現類參考:
public final class ClassUtils {private static final char PACKAGE_SEPARATOR = '.';private static final List<String> 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> T newInstance(Class<T> clazz) {try {Constructor<T> 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) : "";}
}