对于没有实现接口的类,cglib则是更好的选择
切面接口/切面类
public interface CgProxyHanderlerFace {
default void before(Callable func) throws Exception {
func.call();
}
default void after(Callable func) throws Exception {
func.call();
}
}
public class CglibProxy<T> implements MethodInterceptor,CgProxyHanderlerFace{
private T t;
public T getProxy(T t){
this.t=t;
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(t.getClass());
enhancer.setCallback(this);
T proxy = (T) enhancer.create();
return proxy;
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws InvocationTargetException, IllegalAccessException {
return method.invoke(t, args);
}
}
测试
public static void main(String[] args) throws Exception {
Cat2 cat2 = new Cat2();
CglibProxy<Cat2> cglibProxy = new CglibProxy<>();
Cat2 cat2Proxy = cglibProxy.getProxy(cat2);
cglibProxy.before(() -> {
System.out.println("猫咪吃鱼-----前------洗爪爪");
return null;
});
cat2Proxy.eat();
cglibProxy.after(() -> {
System.out.println("猫咪吃鱼-----后------洗爪爪");
return null;
});
}