This commit is contained in:
Looly
2024-07-14 19:32:23 +08:00
parent 213b290f53
commit 73c715b662
3 changed files with 140 additions and 83 deletions

View File

@@ -12,21 +12,16 @@
package org.dromara.hutool.extra.aop;
import org.dromara.hutool.core.classloader.ClassLoaderUtil;
import org.dromara.hutool.core.reflect.JdkProxyUtil;
import org.dromara.hutool.extra.aop.engine.ProxyEngine;
import org.dromara.hutool.extra.aop.engine.ProxyEngineFactory;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* 代理工具类
*
* @author Looly
*/
public class ProxyUtil {
private static final String CGLIB_CLASS_SEPARATOR = "$$";
public class ProxyUtil extends JdkProxyUtil {
/**
* 获取动态代理引擎
@@ -60,70 +55,4 @@ public class ProxyUtil {
public static <T> T proxy(final T target, final Aspect aspect) {
return getEngine().proxy(target, aspect);
}
// region ----- JDK Proxy utils
/**
* 创建动态代理对象<br>
* 动态代理对象的创建原理是:<br>
* 假设创建的代理对象名为 $Proxy0
* 1、根据传入的interfaces动态生成一个类实现interfaces中的接口<br>
* 2、通过传入的classloder将刚生成的类加载到jvm中。即将$Proxy0类load<br>
* 3、调用$Proxy0的$Proxy0(InvocationHandler)构造函数 创建$Proxy0的对象并且用interfaces参数遍历其所有接口的方法这些实现方法的实现本质上是通过反射调用被代理对象的方法<br>
* 4、将$Proxy0的实例返回给客户端。 <br>
* 5、当调用代理类的相应方法时相当于调用 {@link InvocationHandler#invoke(Object, java.lang.reflect.Method, Object[])} 方法
*
* @param <T> 被代理对象类型
* @param classloader 被代理类对应的ClassLoader
* @param invocationHandler {@link InvocationHandler} ,被代理类通过实现此接口提供动态代理功能
* @param interfaces 代理类中需要实现的被代理类的接口方法
* @return 代理类
*/
@SuppressWarnings("unchecked")
public static <T> T newProxyInstance(final ClassLoader classloader, final InvocationHandler invocationHandler, final Class<?>... interfaces) {
return (T) Proxy.newProxyInstance(classloader, interfaces, invocationHandler);
}
/**
* 创建动态代理对象
*
* @param <T> 被代理对象类型
* @param invocationHandler {@link InvocationHandler} ,被代理类通过实现此接口提供动态代理功能
* @param interfaces 代理类中需要实现的被代理类的接口方法
* @return 代理类
*/
public static <T> T newProxyInstance(final InvocationHandler invocationHandler, final Class<?>... interfaces) {
return newProxyInstance(ClassLoaderUtil.getClassLoader(), invocationHandler, interfaces);
}
// endregion
/**
* 是否为代理对象判断JDK代理或Cglib代理
*
* @param object 被检查的对象
* @return 是否为代理对象
*/
public static boolean isProxy(final Object object) {
return isJdkProxy(object) || isCglibProxy(object);
}
/**
* 是否为JDK代理对象
*
* @param object 被检查的对象
* @return 是否为JDK代理对象
*/
public static boolean isJdkProxy(final Object object) {
return Proxy.isProxyClass(object.getClass());
}
/**
* 是否Cglib代理对象
*
* @param object 被检查的对象
* @return 是否Cglib代理对象
*/
public static boolean isCglibProxy(final Object object) {
return (object.getClass().getName().contains(CGLIB_CLASS_SEPARATOR));
}
}