// Path: src/com/qa/framework/bean/Global.java
// public class Global {
//     private List<Sql> sqlList;
//     private List<Function> functionList;
// 
//     private Before before;
//     private After after;
// 
//     public Global() {
//     }
// 
//     public Before getBefore() {
//         return before;
//     }
// 
//     public void setBefore(Before before) {
//         this.before = before;
//     }
// 
//     public After getAfter() {
//         return after;
//     }
// 
//     public void setAfter(After after) {
//         this.after = after;
//     }
// 
//     public List<Sql> getSqlList() {
//         return sqlList;
//     }
// 
//     public List<Function> getFunctionList() {
//         return functionList;
//     }
// 
// 
//     public void addSql(Sql sql) {
//         if (sqlList == null) {
//             sqlList = new ArrayList<Sql>();
//         }
//         sqlList.add(sql);
//     }
// 
//     public void addFunction(Function function) {
//         if (functionList == null) {
//             functionList = new ArrayList<Function>();
//         }
//         functionList.add(function);
//     }
// 
// }
// 
// Path: src/com/qa/framework/classfinder/ClassScanner.java
// public interface ClassScanner {
// 
//     /**
//      * 获取指定包名中的所有类
//      *
//      * @param packageName the package name
//      * @return the class list
//      */
//     List<Class<?>> getClassList(String packageName);
// 
//     /**
//      * 获取指定包名中指定注解的相关类
//      *
//      * @param packageName     the package name
//      * @param annotationClass the annotation class
//      * @return the class list by annotation
//      */
//     List<Class<?>> getClassListByAnnotation(String packageName, Class<? extends Annotation> annotationClass);
// 
//     /**
//      * 获取指定包名中指定父类或接口的相关类
//      *
//      * @param packageName the package name
//      * @param superClass  the super class
//      * @return the class list by super
//      */
//     List<Class<?>> getClassListBySuper(String packageName, Class<?> superClass);
// }
// 
// Path: src/com/qa/framework/classfinder/impl/DefaultClassScanner.java
// public class DefaultClassScanner implements ClassScanner {
// 
//     @Override
//     public List<Class<?>> getClassList(String packageName) {
//         return new ClassTemplate(packageName) {
//             @Override
//             public boolean checkAddClass(Class<?> cls) {
//                 String className = cls.getName();
//                 String pkgName = className.substring(0, className.lastIndexOf("."));
//                 return pkgName.startsWith(packageName);
//             }
//         }.getClassList();
//     }
// 
//     @Override
//     public List<Class<?>> getClassListByAnnotation(String packageName, Class<? extends Annotation> annotationClass) {
//         return new AnnotationClassTemplate(packageName, annotationClass) {
//             @Override
//             public boolean checkAddClass(Class<?> cls) {
//                 return cls.isAnnotationPresent(annotationClass);
//             }
//         }.getClassList();
//     }
// 
//     @Override
//     public List<Class<?>> getClassListBySuper(String packageName, Class<?> superClass) {
//         return new SupperClassTemplate(packageName, superClass) {
//             @Override
//             public boolean checkAddClass(Class<?> cls) {
//                 return superClass.isAssignableFrom(cls) && !superClass.equals(cls);
//             }
//         }.getClassList();
//     }
// }


import com.library.common.ReflectHelper;
import com.qa.framework.bean.Global;
import com.qa.framework.classfinder.ClassScanner;
import com.qa.framework.classfinder.impl.DefaultClassScanner;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
package com.qa.framework;



/**
 * 实例工厂
 */
public class InstanceFactory {

    /**
     * 用于缓存对应的实例
     */
    private static final Map<String, Object> cache = new ConcurrentHashMap<String, Object>();


    /**
     * 获取 ClassScanner
     *
     * @return the class scanner
     */
    public static ClassScanner getClassScanner() {
        return getInstance("class_scanner", DefaultClassScanner.class);
    }

// Path: src/com/qa/framework/bean/Global.java
// public class Global {
//     private List<Sql> sqlList;
//     private List<Function> functionList;
// 
//     private Before before;
//     private After after;
// 
//     public Global() {
//     }
// 
//     public Before getBefore() {
//         return before;
//     }
// 
//     public void setBefore(Before before) {
//         this.before = before;
//     }
// 
//     public After getAfter() {
//         return after;
//     }
// 
//     public void setAfter(After after) {
//         this.after = after;
//     }
// 
//     public List<Sql> getSqlList() {
//         return sqlList;
//     }
// 
//     public List<Function> getFunctionList() {
//         return functionList;
//     }
// 
// 
//     public void addSql(Sql sql) {
//         if (sqlList == null) {
//             sqlList = new ArrayList<Sql>();
//         }
//         sqlList.add(sql);
//     }
// 
//     public void addFunction(Function function) {
//         if (functionList == null) {
//             functionList = new ArrayList<Function>();
//         }
//         functionList.add(function);
//     }
// 
// }
// 
// Path: src/com/qa/framework/classfinder/ClassScanner.java
// public interface ClassScanner {
// 
//     /**
//      * 获取指定包名中的所有类
//      *
//      * @param packageName the package name
//      * @return the class list
//      */
//     List<Class<?>> getClassList(String packageName);
// 
//     /**
//      * 获取指定包名中指定注解的相关类
//      *
//      * @param packageName     the package name
//      * @param annotationClass the annotation class
//      * @return the class list by annotation
//      */
//     List<Class<?>> getClassListByAnnotation(String packageName, Class<? extends Annotation> annotationClass);
// 
//     /**
//      * 获取指定包名中指定父类或接口的相关类
//      *
//      * @param packageName the package name
//      * @param superClass  the super class
//      * @return the class list by super
//      */
//     List<Class<?>> getClassListBySuper(String packageName, Class<?> superClass);
// }
// 
// Path: src/com/qa/framework/classfinder/impl/DefaultClassScanner.java
// public class DefaultClassScanner implements ClassScanner {
// 
//     @Override
//     public List<Class<?>> getClassList(String packageName) {
//         return new ClassTemplate(packageName) {
//             @Override
//             public boolean checkAddClass(Class<?> cls) {
//                 String className = cls.getName();
//                 String pkgName = className.substring(0, className.lastIndexOf("."));
//                 return pkgName.startsWith(packageName);
//             }
//         }.getClassList();
//     }
// 
//     @Override
//     public List<Class<?>> getClassListByAnnotation(String packageName, Class<? extends Annotation> annotationClass) {
//         return new AnnotationClassTemplate(packageName, annotationClass) {
//             @Override
//             public boolean checkAddClass(Class<?> cls) {
//                 return cls.isAnnotationPresent(annotationClass);
//             }
//         }.getClassList();
//     }
// 
//     @Override
//     public List<Class<?>> getClassListBySuper(String packageName, Class<?> superClass) {
//         return new SupperClassTemplate(packageName, superClass) {
//             @Override
//             public boolean checkAddClass(Class<?> cls) {
//                 return superClass.isAssignableFrom(cls) && !superClass.equals(cls);
//             }
//         }.getClassList();
//     }
// }


// Path: src/com/qa/framework/InstanceFactory.java
import com.library.common.ReflectHelper;
import com.qa.framework.bean.Global;
import com.qa.framework.classfinder.ClassScanner;
import com.qa.framework.classfinder.impl.DefaultClassScanner;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

package com.qa.framework;



/**
 * 实例工厂
 */
public class InstanceFactory {

    /**
     * 用于缓存对应的实例
     */
    private static final Map<String, Object> cache = new ConcurrentHashMap<String, Object>();


    /**
     * 获取 ClassScanner
     *
     * @return the class scanner
     */
    public static ClassScanner getClassScanner() {
        return getInstance("class_scanner", DefaultClassScanner.class);
    }

    public static Global getGlobal() {