注册模式常用于处理需要实现多个扩展功能,而不需要改变原有的代码结构功能。
/**
* <p>Description: sql Parser</p>
*
* @author ccc
* @date 2020/6/21 9:38
* @since JDK1.8
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.TYPE})
@Documented
public @interface Parser {
String aliasName() default "";
}
/**
* <p>Description: mysql type</p>
*
* @author ccc
* @date 2020/6/21 9:42
* @since JDK1.8
*/
@Parser(aliasName = "mysql")
public class MysqlParser {
public void deal(){
System.out.println("this is mysql");
}
}
/**
* <p>Description: oracle type</p>
*
* @author ccc
* @date 2020/6/21 9:43
* @since JDK1.8
*/
@Parser(aliasName = "oracle")
public class OracleParser {
public void deal(){
System.out.println("this is oracle");
}
}
/**
* <p>Description: sql server type</p>
*
* @author ccc
* @date 2020/6/21 9:43
* @since JDK1.8
*/
@Parser(aliasName = "sqlserver")
public class SqlServerParser {
public void deal(){
System.out.println("this is sqlserver");
}
}
/**
* <p>Description: scan classutil</p>
*
* @author ccc
* @date 2020/6/18 9:30
* @since JDK1.8
*/
public final class ClassUtil {
private static final Set<Class<?>> classes = new HashSet<>();
/**
* 扫描某个包名下的所有class文件或是扫描jar文件
*
* @param packageName 包名
* @return 所有 Class<?>
*/
public static Set<Class<?>> scanPackage(String packageName) {
return scanPackage(packageName, true);
}
/**
* 扫描某个包名下的所有class文件或是扫描jar文件
*
* @param packageName 包名
* @param recursive 是否循环递归
* @return 所有 Class<?>
*/
public static Set<Class<?>> scanPackage(String packageName, boolean recursive) {
String packageDirName = packageName.replace('.', '/');
System.err.println("packageDirName---------------" + packageDirName);
Enumeration<URL> urls;
try {
urls = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
while (urls.hasMoreElements()) {
// 获取下一个元素
URL url = urls.n