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[]{});//反射改方法
}
}
}