Implementação personalizada do código-fonte do Spring

Índice

1. Este artigo atinge o objetivo

2. Anotações personalizadas

3. Defina o controlador e as anotações personalizadas

4. Reconheça a anotação

5. Examine o diretório e retorne todos os nomes de arquivo (nomes totalmente qualificados) no diretório

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

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

9. Resultado da execução


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!"); 
    } 
}

9. Resultado da execução

Acho que você gosta

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