计算机基础知识分享-4(IOC,DI,java反射机制)

IOC控制反转(Inversion of Control)

我们传统的javaSE程序等都基本是一种典型的相互依赖的程序,也就是一些相互协作的对象构成的。也就是我们所说的正转,即是通过硬编程new一些对象然后对象间相互依赖。所谓的的控制反转就是把创建和查找对象交给容器。

  1. 目的:IOC是一种编程思想,建立一个松散耦合的程序。(高内聚,低耦合的思想)

  2. 把对对象的控制权交给IOC容器控制对象的生命周期和对象间的关系

  3. 通过例子理解:

    • 原始社会中,比如我们需要斧子,就得自己设计斧子,打造斧子,最后才能用这把自己做的斧子。这就有点类似JAVA中自己创建一个对象,然后通过new的方式创建一个对象调用对象的方法。
    • 在工业社会中,比如我们需要斧子,就的去商店购买一把斧子,而这把斧子就从工厂中生产出来的。这个时候就像是JAVA中工厂模式,需要某些对象时候就通过简单的工厂模式设计,我们只要调用工厂类就可以得到想要的对象。
    • 在牛逼的共产主义社会中,我们就只要坐等斧子的到来,全自动的给我们斧子对象,等待IOC容器的注入对象。(无需理会斧子要怎么new一个对象,无需定位工厂类)

DI依赖注入(Dependency Injection)

其实IOC依赖注入和DI控制反转是统一的,在一个运行的IOC容器中,容器能够动态的提供给一些需要的其他对象或者说组件中。这些需要的对象就是通过DI这个方式注入来实现的。至于怎么实现,就是通过JAVA的反射机制来实现的。

  1. 注入的方式:
    1. setter设值注入
    2. 构造注入
  2. java的反射机制
    1. 概念:在java运行的过程中,对于任意的类都可以知道他的所有属性和方法,对于任意一个对象都可以调用他的属性和方法,这种动态获取对象和调用对象方法的功能。
    2. 反射机制获取类有三种方法:
    //第一种方式:  
    Classc1 = Class.forName("Employee");  
    //第二种方式:  
    //java中每个类型都有class 属性.  
    Classc2 = Employee.class;  
     
    //第三种方式:  
    //java语言中任何一个java对象都有getClass 方法  
    Employeee = new Employee();  
    Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)  
    
    1. 创建对象:获取类以后我们来创建它的对象,利用newInstance
    Class c =Class.forName("Employee");  
    //创建此Class 对象所表示的类的一个新实例  
    Objecto = c.newInstance(); //调用了Employee的无参数构造方法. 
    
    1. 获取属性:分为所有的属性和指定的属性:
     ```
     /获取整个类  
         Class c = Class.forName("java.lang.Integer");  
           //获取所有的属性?  
         Field[] fs = c.getDeclaredFields();  
    
                //定义可变长的字符串,用来存储属性  
         StringBuffer sb = new StringBuffer();  
         //通过追加的方法,将每个属性拼接到此字符串中  
         //最外边的public定义  
         sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");  
         //里边的每一个属性  
         for(Field field:fs){  
             sb.append("\t");//空格  
             sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等  
             sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字  
             sb.append(field.getName()+";\n");//属性的名字+回车  
         }  
    
         sb.append("}");  
    
         System.out.println(sb);  
         
     ```
     ```
     public static void main(String[] args) throws Exception{  
         /* 
         User u = new User(); 
         u.age = 12; //set 
         System.out.println(u.age); //get 
         */  
                   
         //获取类  
         Class c = Class.forName("User");  
         //获取id属性  
         Field idF = c.getDeclaredField("id");  
         //实例化这个类赋给o  
         Object o = c.newInstance();  
         //打破封装  
         idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。  
         //给o对象的id属性赋值"110"  
         idF.set(o, "110"); //set  
         //get  
         System.out.println(idF.get(o));  
     }  
    
     ```
    

你可能感兴趣的:(计算机基础知识分享-4(IOC,DI,java反射机制))