首页 > 其他分享 >Spring -- IOC 手写

Spring -- IOC 手写

时间:2024-01-12 23:22:06浏览次数:28  
标签:java String -- Spring clazz new import IOC class

. java 反射

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。

要想解剖一个类,必须先要获取到该类的Class对象。而剖析一个类或用反射解决具体的问题就是使用相关API**(1)java.lang.Class(2)java.lang.reflect**,所以,Class对象是反射的根源。

 

 

手写IOC

package Bean;

import org.springframework.context.annotation.Bean;

import javax.print.DocFlavor;
import java.io.File;
import java.io.IOException;

import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

public class AnnApplicationContextIMPL implements ApplicationContext{
    /*创建map防止bean对象*/
    private  Map<Class,Object> beanfactory=new HashMap<>();
    private  static String  rootPath;
    @Override
    public Object GetBean(Class clazz) {
        return beanfactory.get(clazz);
    }

    //设置包扫描规则
    //当前包 及其子包 如果有注解 就通过反射进行实例化
    public AnnApplicationContextIMPL(String basePackage){
       //public static void pathdemo1(String basePackage){
        try {
        //1.把里面的。换成\
       String PackagePath= basePackage.replaceAll("\\.","\\\\");
        //2.获取包的绝对路径

            Enumeration urls= Thread.currentThread().getContextClassLoader().getResources(PackagePath);
            while (urls.hasMoreElements()){
                URL url= (URL) urls.nextElement();
               String filePath=  URLEncoder.encode(url.getFile(),"utf-8");
                System.out.println("filePath = " + filePath);
                //获取包相对路径  截取
                rootPath=filePath.substring(0,filePath.length()-basePackage.length());
                //包扫描
                leanBean(new File(filePath));
            }
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    //包扫描的过程
    private  void leanBean(File file) throws ClassNotFoundException {
        //1.判断当前内容是不是文件夹

        if (file.isDirectory()){
            //2.获取文件夹的所有内容 包括子文件夹
            File[] childrenfile=file.listFiles();
            //3.判断是否为空
            if (childrenfile==null||childrenfile.length==0){
                return;
            }
            //4.如果不为空 遍历所有内容
            for (File child:childrenfile){
                //4.1.遍历每个file对象,继续判断是否为空,递归。
                if (child.isDirectory()){
                    leanBean(child);
                }else {
                    //4.2.得到的flie如果不是文件夹,是文件。.
                    //4.3.得到包路径+类名称-----即是字符串截取
                    String pathWithClass =
                            child.getAbsolutePath().substring(rootPath.length()-1);
                    //4.4.判断当前文件类型 是否是.class类型
                   if (pathWithClass.contains(".class")){
                       //4.5.如果是.class类型 如果是 把路径\替换成. 把.class去掉
                       String allName=pathWithClass.replaceAll("\\\\",".").
                               replace(".class","");


                       //4.6.判断类上是否有注解@bean,如果有进行实例化

                            //4.6.1 获取类的class 对象
                            Class<?> clazz = Class.forName(allName);
                            //4.6.2判断是不是接口
                            if(clazz.isInterface()){
                            //判断上面是否有注解@
                                Bean annotation = clazz.getAnnotation(Bean.class);
                                if (annotation!=null){
                                    try {
                                        Object instance = clazz.getConstructor().newInstance();
                                        //4.7把实例化之后的内容 放入Map
                                        //4.7.1 判断当前类是否有接口 让class作为map的类
                                        if (clazz.getInterfaces().length>0){
                                            beanfactory.put(clazz.getInterfaces()[0],instance);
                                        }else{
                                            beanfactory.put(clazz,instance);
                                        }

                                    } catch (InstantiationException e) {
                                        throw new RuntimeException(e);
                                    } catch (IllegalAccessException e) {
                                        throw new RuntimeException(e);
                                    } catch (InvocationTargetException e) {
                                        throw new RuntimeException(e);
                                    } catch (NoSuchMethodException e) {
                                        throw new RuntimeException(e);
                                    }
                                }

                            }



                   }

                }
            }


        }


    }

    
}

 

标签:java,String,--,Spring,clazz,new,import,IOC,class
From: https://www.cnblogs.com/zhbx/p/17961680

相关文章

  • Redis持久化之RDB和AOF
    Redis是基于内存的,内存中的信息断电丢失,有时需要持久化来解决这个弊端。在之前的文章中Shiro中使用Redis管理session-东方来客-博客园(cnblogs.com)使用了Redis管理Shiro的session。想要配置Redis持久化不是在Maven项目中,而是要通过redis.conf配置来影响Redis,这里通过Doc......
  • 【APP逆向04】Frida的下载与安装
    HOOK是什么?Hook框架是一种技术,用于在运行时拦截和修改应用程序的行为。通过Hook,你可以劫持应用程序的方法调用、修改参数、篡改返回值等,以达到对应用程序的修改、增强或调试的目的。常见的hook框架XposedFramework:Xposed是一个功能强大的开源Hook框架,可以在不修改......
  • 【opencv学习笔记】028之模板匹配——matchTemplate函数详解
    目录​ ​一、前言​​​ ​二、模板匹配​​​ ​1、模板匹配是个啥​​​ ​2、常用匹配算法​​​​ ​3、API​​​ ​4、代码展示​​​ ​5、执行结果​​一、前言遭遇了点突发情况,所以今天更新的有点晚,也不知道能不能等到今天发出去了。终于可以从模板匹......
  • TURN SERVER vs. ICE SERVER
    您好!"turnserver"是指转发实时通信数据的服务器。它在网络通信中起到重要的作用,特别是在进行实时音视频通话或者实时消息传递时。您有关于转发服务器的具体问题吗?我将尽力为您提供帮助。--ICE(InteractiveConnectivityEstablishment)服务器是用于实时通信(如WebRTC)的网络服务器......
  • 多线程(Java.Thread)学习
    多线程(Java.Thread)学习线程简介:1、线程是独立执行的路径2、程序运行时有很多后台进程比如主线程、young.gc、full.gc()3、main是主线程,系统入口,用于执行整个程序4、一个进程中、如果开辟多个线程,线程的运行由调度器安排调度、调度器的先后顺序不能人为干预5、对同一份资......
  • Android Webview判断网页加载完毕
    原文:AndroidWebview判断网页加载完毕-Stars-One的杂货小窝书接上文,在AndroidWebView获取html源码-Stars-One的杂货小窝此文讲到没有一个可以判断网页加载完毕的方法最近发现确实是有个解决方案,就是设置webViewClient里的onPageFinished方法判断当前webview进度,如下......
  • python 里面的eval exec 还有compile
    一、简介二、操作三、问题 一、简介evalexec方法是python里面内置的方法,用于将字符串代码或者code对象,进行执行的方法。参考至:这里二、操作1eval计算指定表达式的值。也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作......
  • idea 热部署插件 JRebel
    前言:热部署:是在不关闭或重启服务的情况下,更新Java类文件或配置文件,实现修改内容生效;通过热部署,可提高开发效率,节省程序打包重启的时间;同时,可实现生产环境中需要不停机或重启的服务的升级。 随着代码量增加,也需要不断改动,我们需要重新Run或者DeBug。开发效率......
  • IDEA常用快捷键大全
    为方便大家提升IDEA开发操作效率,参考了IntelliJIDEA的官网,列举了IntelliJIDEA(Windows版本)的所有快捷键。一、构建/编译Ctrl+F9:构建项目使用此快捷键等同于菜单【Build】—>【BuildProject】1使用此命令后,IntelliJIDEA会编译项目中所有类,并将编译结果输出到out目录中。......
  • c++ opencv直线检测
     #include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>usingnamespacecv;intmain(intargc,char**argv){//读取图像Matsrc=imread(argv[1],CV_LOAD_IMAGE_COLOR);if......