AfterAdviceBuilder.java
package sprout.aop.advice.builder;
import sprout.aop.JoinPoint;
import sprout.aop.advice.Advice;
import sprout.aop.advice.AdviceBuilder;
import sprout.aop.advice.interceptor.SimpleAfterInterceptor;
import sprout.aop.advisor.Advisor;
import sprout.aop.advisor.DefaultAdvisor;
import sprout.aop.advisor.Pointcut;
import sprout.aop.advisor.PointcutFactory;
import sprout.aop.annotation.After;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.function.Supplier;
public class AfterAdviceBuilder implements AdviceBuilder {
@Override
public Advisor build(Class<?> aspectCls,
Method method,
Supplier<Object> aspectSup,
PointcutFactory pf) {
After after = method.getAnnotation(After.class);
if (method.getParameterCount() > 1 ||
(method.getParameterCount() == 1 &&
!JoinPoint.class.isAssignableFrom(method.getParameterTypes()[0]))) {
throw new IllegalStateException("@Before method must have 0 or 1 JoinPoint param");
}
Pointcut pc = pf.createPointcut(after.annotation(),
after.pointcut());
Supplier<Object> safe = Modifier.isStatic(method.getModifiers())
? () -> null
: aspectSup;
Advice advice = new SimpleAfterInterceptor(safe, method);
return new DefaultAdvisor(pc, advice, 0);
}
}