Índice
1. Este artigo atinge o objetivo
3. Defina o controlador e as anotações personalizadas
7. Crie uma instância por reflexão
8. Mobilize a instância através do método exec e execute o método na instância
1. Este artigo atinge o objetivo
- anotação personalizada
- reconhecer esta anotação
- Criar uma instância por reflexão
- Mobilize a instância por meio do método exec para executar o método na instância
2. Anotações personalizadas
Para obter detalhes, consulte: Anotação personalizada (Annontation)_qq_52240237's Blog-CSDN Blog
importar java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @ interface Controller { }
importar java.lang.annotation.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) public @interface RequestMapping { /** * * @return */ String value() default ""; }
3. Defina o controlador e as anotações personalizadas
@Controller @RequestMapping("test") public class TestController { @RequestMapping public String index(){ System.out.println("Esta é a classe de teste"); return ""; } @RequestMapping("index1") public String index1 (){ System.out.println("Este é o método index1 da classe de teste"); return ""; } }
4. Reconheça a anotação
private static boolean isController(Class cl){ Annotation annotation = cl.getAnnotation(Controller.class); if(annotation!=null){ return true; } retorna falso; } private static boolean isRequestMapping(Class cl){ Annotation annotation = cl.getAnnotation(RequestMapping.class); if(annotation!=null){ return true; } retorna falso; } private static boolean isRequestMapping(Method method){ Annotation annotation = method.getAnnotation(RequestMapping.class); if(annotation!=null){ return true; } retorna falso; } private static RequestMapping getRequestMapping(Class cl){ Annotation annotation = cl.getAnnotation(RequestMapping.class); if(instância de anotação de RequestMapping){ return (RequestMapping) anotação; } retornar nulo; } private static RequestMapping getRequestMapping(Method method){ Annotation annotation = method.getAnnotation(RequestMapping.class); if(instância de anotação de RequestMapping){ return (RequestMapping) anotação; } retornar nulo; }
5. Examine o diretório e retorne todos os nomes de arquivo (nomes totalmente qualificados) no diretório
private static List<String> traverseFolder2(String caminho) { Arquivo arquivo = new Arquivo(caminho); List<String> classFiles=new ArrayList<>(); if (file.exists()) { LinkedList<Arquivo> list = new LinkedList<Arquivo>(); Arquivo[] arquivos = arquivo.listaArquivos(); for (Arquivo arquivo2 : arquivos) { if (arquivo2.isDirectory()) { list.add(arquivo2); } else { classFiles.add(file2.getAbsolutePath()); } } Arquivo temp_file; while (!list.isEmpty()) { temp_file = list.removeFirst(); //.listFiles(): 该目录中的文件和目录 arquivos = temp_file.listFiles(); for (File file2 : files) { //.isDirectory(): Verifica se o diretório é uma pasta padrão if (file2.isDirectory()) { list.add(file2); } else { //.getAbsolutePath(): retorna a string de caminho absoluto do caminho abstrato classFiles.add(file2.getAbsolutePath()); } } } } else { } return classFiles; }
6. Examine todas as classes e métodos com essas duas anotações no pacote onde o arquivo está localizado e coloque-as no mapa
private static HashMap<String, Map<String,Method>> map=new HashMap<>(); private static HashMap<String, Object> objMap=new HashMap<>();public static void scanner(String path,String packageName){ List<String> paths = traverseFolder2(path); for (String p : paths) { p=p.substring(path.length()-1); try { 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[] declaradoMetodos = cl.getDeclaradoMetodos(); for (Método declaradoMetodo : métodos declarados) { if(isRequestMapping(método declarado)){ mapeamento de RequestMapping = getRequestMapping(método declarado); if(map.get(requestMapping.value()).containsKey(mapping.value())){ throw new RuntimeException("方法多注解值:"+requestMapping.value()); }else { map.get(requestMapping.value()).put(mapping.value(),declaredMethod); } } } }else { throw new RuntimeException("RequestMapping"); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } }
7. Crie uma instância por reflexão
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)); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } }
8. Mobilize a instância através do método exec e execute o método na instância
public class Main { static { //Encontre o arquivo fileName no mesmo caminho da classe de chamada atual String path = Main.class.getResource("").getPath(); //Retorne o nome do pacote desta classe String packageName = Main.class.getPackage().getName(); HeaboyMvc.scanner(path,packageName); } public static void main(String[] args) { HeaboyMvc.exec("",""); HeaboyMvc.exec("teste ","index1"); HeaboyMvc.exec("test",""); System.out.println("Hello World!"); } }