package org.nutz.ioc.aop.config.impl;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.nutz.aop.MethodInterceptor;
import org.nutz.aop.MethodMatcher;
import org.nutz.aop.matcher.SimpleMethodMatcher;
import org.nutz.ioc.Ioc;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.aop.config.AopConfigration;
import org.nutz.ioc.aop.config.InterceptorPair;
import org.nutz.lang.Mirror;
/**
* 通过扫描@Aop标注过的Method判断需要拦截哪些方法
*
* @author wendal(wendal1985@gmail.com)
*
*/
public class AnnotationAopConfigration implements AopConfigration {
public List<InterceptorPair> getInterceptorPairList(Ioc ioc, Class<?> clazz) {
Mirror<?> mirror = Mirror.me(clazz);
List<Method> aops = this.getAopMethod(mirror);
List<InterceptorPair> ipList = new ArrayList<InterceptorPair>();
if (aops.size() < 1)
return ipList;
for (Method m : aops) {
MethodMatcher mm = new SimpleMethodMatcher(m);
for (String nm : m.getAnnotation(Aop.class).value())
ipList.add(new InterceptorPair(ioc.get(MethodInterceptor.class, nm), mm));
}
return ipList;
}
private <T> List<Method> getAopMethod(Mirror<T> mirror) {
List<Method> aops = new LinkedList<Method>();
for (Method m : mirror.getMethods())
if (null != m.getAnnotation(Aop.class)) {
int modify = m.getModifiers();
if (!Modifier.isAbstract(modify))
if (!Modifier.isFinal(modify))
if (!Modifier.isPrivate(modify))
if (!Modifier.isStatic(modify))
aops.add(m);
}
return aops;
}
}