有时间写个分析过程!
package com.myspring.app.annos;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.aspectj.lang.ProceedingJoinPoint;
public class RedisAnnoTest {
@RedisScan
public void save(@RedisSave()int id,@RedisSave()String name){
}
public static void main(String[] args) {
Class<?> clazz = RedisAnnoTest.class;
Method[] methods = clazz.getDeclaredMethods();
for(Method m : methods){
RedisScan rs = m.getAnnotation(RedisScan.class);
if(rs!=null){
//check返回类型
checkReturnType(m);
Annotation[][] annos = m.getParameterAnnotations();
List<KeyValue> kvList = queryAnno(annos);
int[] flags = checkAnno(RedisSave.class, kvList);
ProceedingJoinPoint point = null;
Object[] objs = point.getArgs();
List<Object> hasAnnoObjList = getObjects(flags,objs);
try {
Object obj = point.proceed();//返回值(检验是对象还是List)
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
public static List<Object> getObjects(int[] flags,Object[] objs){
if(flags.length==0 || objs.length == 0){
return null;
}
List<Object> list = new ArrayList<Object>();
for(int i=0;i<flags.length;i++){
list.add(objs[flags[i]]);
}
return list;
}
public static int[] checkAnno(Class<? extends Annotation> annoClass,List<KeyValue> list){
int[] flags = new int[list.size()];
int k = 0;
for(int i=0;i<list.size();i++){
KeyValue kv = list.get(i);
if(annoClass.isAssignableFrom(kv.getAnnotation().getClass())){//如果有目标注解
flags[k++] = list.get(i).getFlag();
}
}
return flags;
}
public static List<KeyValue> queryAnno(Annotation[][] annos){
List<KeyValue> kvList = new ArrayList<KeyValue>();
for(int i=0;i<annos.length;i++){
for(int j=0;j<annos[i].length;j++){
if(annos[i][j]!=null){
KeyValue kv = new KeyValue(i,annos[i][j]);
kvList.add(kv);
}
}
}
return kvList;
}
public static class KeyValue{
private int flag;
private Annotation annotation;
public KeyValue(int flag,Annotation annotation){
this.flag = flag;
this.annotation = annotation;
}
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
public Annotation getAnnotation() {
return annotation;
}
public void setAnnotation(Annotation annotation) {
this.annotation = annotation;
}
public String toString(){
return "[flag="+flag+",annotation="+annotation+"]";
}
}
}