??最近在研讀java設(shè)計模式诵姜,看到其工廠模式實現(xiàn)類哆键,通過switch case 不同的類型返回不同的處理方式類(這種寫法每次新增一個工廠類都要修改case),突然萌生一個想法卦睹,能不能通過注解的方式來這個方式畦戒,以下就是我來實現(xiàn)的demo,有什么問題大家可以留言指出结序。
依賴jar
<!-- https://mvnrepository.com/artifact/org.reflections/reflections -->
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.11</version>
</dependency>
自定義注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface TestAnnotat {
String des() default "用于測試";
}
多個處理類實現(xiàn)
public interface FunHandler {
void handle(String name);
}
@TestAnnotat(des = "數(shù)據(jù)測試")
public class DataHandler implements FunHandler {
public void handle(String name){
System.out.println("數(shù)據(jù) name = " + name);
}
}
@TestAnnotat(des = "消息測試")
public class MsgHandler implements FunHandler {
public void handle(String name){
System.out.println("消息 name = " + name);
}
}
注:需要掃描的處理類都放在一個包下障斋,方便掃描
反射掃描各實現(xiàn)方法
String pkg = FunHandler.class.getPackage().getName(); // 獲取需要掃描的包名
System.out.println("pkg = " + pkg);
Reflections f = new Reflections(pkg);
Set<Class<?>> set = f.getTypesAnnotatedWith(TestAnnotat.class);
for (Class<?> c : set) {
Object bean = c.newInstance();
TestAnnotat annotation = c.getAnnotation(TestAnnotat.class);
System.out.println("annotation.des() = " + annotation.des());
FunHandler funHandler = (FunHandler)bean;
funHandler.handle("test");
}