Implementación personalizada del código fuente de Spring

Tabla de contenido

1. Este artículo logra el objetivo

2. Anotaciones personalizadas

3. Defina el controlador más anotaciones personalizadas

4. Reconocer la anotación

5. Escanee el directorio y devuelva todos los nombres de archivo (nombres completos) en el directorio

6. Escanee todas las clases y métodos con estas dos anotaciones en el paquete donde se encuentra el archivo y póngalos en el mapa

7. Crea una instancia por reflexión

8. Movilizar la instancia a través del método exec y ejecutar el método en la instancia

9. Resultado de la ejecución


1. Este artículo logra el objetivo

  •  anotación personalizada
  • reconocer esta anotación
  • Crear una instancia por reflexión
  • Movilizar la instancia a través del método exec para ejecutar el método en la instancia

2. Anotaciones personalizadas

Para obtener más información, consulte: Anotación personalizada (Annontation)_qq_52240237's Blog-CSDN Blog

importar java.lang.annotation.*; 

@Documentado 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
interfaz pública @ Controlador { 
}
importar java.lang.annotation.*; 

@Documentado 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.TYPE,ElementType.METHOD}) 
public @interface RequestMapping { 
    /** 
     * 
     * @return 
     */ 
    String value() default ""; 
}

3. Defina el controlador más anotaciones personalizadas

@Controller 
@RequestMapping("prueba") 
clase pública TestController { 
    @RequestMapping 
    public String index(){ 
        System.out.println("Esta es la clase de prueba"); 
        return ""; 
    } 
    @RequestMapping("index1") 
    public String index1 (){ 
        System.out.println("Este es el método index1 de la clase de prueba"); 
        return ""; 
    } 
}

4. Reconocer la anotación

isController booleano estático privado (Clase cl) { 

    Anotación anotación = cl.getAnnotation (Controlador.clase); 
    if(anotación!=null){ 
        return true; 
    } 
    devuelve falso; 
} 
booleano estático privado isRequestMapping(Class cl){ 
    Anotación anotación = cl.getAnnotation(RequestMapping.class); 
    if(anotación!=null){ 
        return true; 
    } 
    devuelve falso; 
} 
isRequestMapping booleano estático privado (método de método) { 
    Anotación anotación = method.getAnnotation (RequestMapping.class); 
    if(anotación!=null){ 
        return true; 
    } 
    devuelve falso; 
}
privado estático RequestMapping getRequestMapping(Class cl){ 
    Anotación anotación = cl.getAnnotation(RequestMapping.class); 
    if(instancia de anotación de RequestMapping){ 
        return (RequestMapping) anotación; 
    } 
    devuelve nulo; 
} 
privado estático RequestMapping getRequestMapping(Método de método){ 
    Anotación anotación = method.getAnnotation(RequestMapping.class); 
    if(instancia de anotación de RequestMapping){ 
        return (RequestMapping) anotación; 
    } 
    devuelve nulo; 
}

5. Escanee el directorio y devuelva todos los nombres de archivo (nombres completos) en el directorio

lista estática privada <String> traverseFolder2 (ruta de la cadena) { 
    Archivo archivo = nuevo archivo (ruta); 
    List<String> classFiles=new ArrayList<>(); 
    if (file.exists()) { 
        LinkedList<File> list = new LinkedList<File>(); 
        Archivo[] archivos = archivo.listFiles(); 
        for (Archivo archivo2: archivos) { 
            if (archivo2.isDirectory()) { 
                lista.add(archivo2); 
            } más { 
                classFiles.add(file2.getAbsolutePath()); 
            } 
        } 
        Archivo archivo_temp; 
        while (!list.isEmpty()) { 
            temp_file = list.removeFirst(); 
            //.listFiles(): 该目录中的文件和目录
            archivos = archivo_temp.listFiles(); 
            for (File file2 : files) { 
                //.isDirectory(): Comprobar si el directorio es una carpeta estándar 
                if (file2.isDirectory()) { 
                    list.add(file2); 
                } else { 
                    //.getAbsolutePath(): devuelve la cadena de nombre de ruta absoluta del nombre de ruta abstracto 
                    classFiles.add(file2.getAbsolutePath()); 
                } 
            } 
        } } 
    else { 

    } 
    return classFiles; 
}

6. Escanee todas las clases y métodos con estas dos anotaciones en el paquete donde se encuentra el archivo y póngalos en el mapa

private static HashMap<String, Map<String,Method>> map=new HashMap<>(); 
private static HashMap<String, Object> objMap=new HashMap<>();
escáner de vacío estático público (ruta de la cadena, nombre del paquete de la cadena) { 
    List <String> rutas = traverseFolder2 (ruta); 
    for (String p : rutas) { 
        p=p.substring(ruta.longitud()-1); 
        intente { 
            String className=packageName+"."+p.replaceAll( Matcher.quoteReplacement(File.separator),"."); 
            String replace = className.replace(".class", ""); 
            Class<?> cl = ClassLoader.getSystemClassLoader().loadClass(replace); 
            if(isController(cl)){ 
                if(isRequestMapping(cl)){ 
                    RequestMapping requestMapping = getRequestMapping(cl); 
                    if(map.containsKey(requestMapping.value())){
                        throw new RuntimeException("类多注解值:"+requestMapping.
                    }else { 
                        map.put(requestMapping.value(),new HashMap<>()); 
                        objMap.put(requestMapping.value(),cl.newInstance()); 
                    } 
                    Método[] métodos declarados = cl.getDeclaredMethods(); 
                    for (Método declaradoMétodo: métodos declarados) {  
                        if(isRequestMapping(declaredMethod)){ 
                            RequestMapping mapeo = getRequestMapping(declaredMethod); 
                            if(map.get(requestMapping.value()).containsKey(mapping.value())){
                                throw new RuntimeException("方法多注解值:"+requestMapping.value()); 
                            }else { 
                                map.get(requestMapping.value()).put(mapping.value(),declaredMethod); 
                            } 
                        } 
                    } 
                }más {
                    throw new RuntimeException("类无requestMapping"); 
                } 
            } 
        } catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IllegalAccessException e) { 
            e.printStackTrace(); 
        } captura (Excepción de instancias e) {
            e.printStackTrace(); 
        } 
} 
    }

7. Crea una instancia por reflexión

private static HashMap<String, Map<String,Method>> map=new HashMap<>(); 
private static HashMap<String, Object> objMap=new HashMap<>(); 
public static void exec(String classPath,String methodPath){ 
    if(objMap.get(classPath)==null){ 
        System.out.println("没有这个类 404"); 
    }else { 
        if(map.get(classPath).get(methodPath)==null){ 
            System.out.println("没有这个方法 404"); 
        }else { 
            try { 
                map.get(classPath).get(methodPath).invoke(objMap.get(classPath)); 
            } captura (IllegalAccessException e) {  
                e.printStackTrace(); 
            } captura (InvocaciónTargetException e) {
                e. imprimirSeguimientoPila(); 
            } 
        } 
} 
    }

8. Movilizar la instancia a través del método exec y ejecutar el método en la instancia

public class Main { 
    static { 
        //Encuentre el archivo fileName en la misma ruta que la clase de llamada actual 
        String path = Main.class.getResource("").getPath(); 
        //Devuelva el nombre del paquete de esta clase 
        String packageName = Main.class.getPackage().getName(); 
        HeaboyMvc.scanner(ruta, nombre del paquete); 
    } 

    public static void main(String[] args) { 
        HeaboyMvc.exec("",""); 
        HeaboyMvc.exec("test ","index1"); 
        HeaboyMvc.exec("prueba",""); 
        System.out.println("¡Hola mundo!"); 
    } 
}

9. Resultado de la ejecución

Supongo que te gusta

Origin blog.csdn.net/qq_52240237/article/details/132185075
Recomendado
Clasificación