Tabla de contenido
1. Este artículo logra el objetivo
3. Defina el controlador más anotaciones personalizadas
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
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!"); } }