1,自定义注解名字
@Target({ElementType.TYPE, ElementType.METHOD}) //类名或方法上
@Retention(RetentionPolicy.RUNTIME)//运行时
@component//自定义多个注解,且在一个类中添加两个或以上的,只需要加一个 否则会实例化多次。
public @interface SocketMapping {
String value() default "";//参数
}
2.测试类
@SocketMapping("/a")
public class TestAnno {
@SocketMapping(value="/b")
public void ss(){
System.out.println(11);
}
}
3,解析测试类所在的包,反射
ResourcePatternResolver rpr = new PathMatchingResourcePatternResolver();
Resource[] res = rpr.getResources("classpath*:websocket/**.class");//测试类的包
for(int i=0;i<res.length;i++){
String className = res[i].getURL().getPath();
className = className.split("(classes/)|(!/)")[1];
className = className.replace("/", ".").replace(".class", "");//获取到文件结构 com.xl.joe.testAnno
Class<?> cla = Class.forName(className);//获取到文件类
if(cla.isAnnotationPresent(SocketMapping.class)){//判断是否存在自定义注解
System.out.println(cla.getAnnotation(SocketMapping.class).value());//获取自定义注解的属性值
}
Object o = SpringContextUtil.getBean("testAnno");//获取类对象
Method[] methods = cla.getMethods();//获取类的方法
for(Method method:methods){
if(method.isAnnotationPresent(SocketMapping.class)){//找到自定义注解
method.invoke(o, new Object[]{});//反射改方法
}
}
}