美文网首页
spring学习总结(一) 反射

spring学习总结(一) 反射

作者: 随月踏清风 | 来源:发表于2019-02-09 17:21 被阅读0次

spring的两大核心是IOC(控制反转)和AOP(面向切编程),首先我们先研究下什么是反射。

反射

在传统的开发过程中,对象是程序使用使用new创建出来的;但是在spring中是通过IOC容器创建,再推送给调用者。


IOC运用反射机制和工厂模式的概念

1.什么是反射。官方给出的定义是:反射是java语言的一个特性,他允许程序在运行时来进行自我检查并且对内部的成员进行操作。例如他允许一个java类获取他所有的成变量和方法并显示出来。在java中,只要知道了类的名字,就可以通过反射机制获得类的所有信息。当然,反射机制不止是java有

2.反射有什么作用。在运行时(编译时获得java对象的属性、方法、构造方法。

3.反射机制的优缺点。优点:可以动态地实对象的创编译。使用反射是一种解释操作,用于字段和方法接入时比普通程序慢的多。因此建议用在灵活性和扩展性要求较高的程序上。反射绕过了源代码的逻辑,为程序的可维护性带来了一定的影响。

4.常用的方法。


getName()获得类的完整名字

getPackage()获取此类所属的包

getSuperclass()获得此类的父类对应的Class对象

getField(String name)获得类的指定属性

getMethods()获得类的public类型的方法

getMethod (String name,Class [] args)获得类的指定方法

spring中IOC实现原理。

1.如果我们不用反射机制实现工厂模式可以这样写:

interface Worker {
    public abstract void work();
}

class Coder implements Worker {
    public void work() {
        System.out.println("I am coding.");
    }
}

class Leader implements Worker {
    public void work() {
        System.out.println("I am talking.");
    }
}

// 构造工厂,以后如果新增工种,在该方法中添加
class Factory {
    public static Worker getInstance(String workerClassName) {
        Worker worker = null;
        if("Coder".equals(workerClassName)){
            worker = new Coder();
        }
        if("Leader".equals(workerClassName)){
            worker = new Leader();
        }
        return worker;
    }
}

// 测试类
class Test {
    public static void main(String args[]){
        Worker worker = Factory.getInstance("Coder");
        worker.work();
    }
}

上述写法存在一定问题:当新增工种时,如Trainer时,除了要新增一个Trainer类,同时还要去修改构造工厂的方法。

2.如果用反射机制的话则可以避免这个问题,如下:

interface Worker {
    public abstract void work();
}

class Coder implements Worker {
    public void work() {
        System.out.println("I am coding.");
    }
}

class Leader implements Worker {
    public void work() {
        System.out.println("I am talking.");
    }
}

// 构造工厂
class Factory{
    public static Worker getInstance(String ClassName) {
        Worker worker = null;
        try{
            worker = (Worker)Class.forName(ClassName).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return worker;
    }
}

// 测试类
class Test {
    public static void main(String args[]){
        Worker worker = Factory.getInstance("worker.Coder"); // worker为Coder所在包名,此处传入的是该类的完整路径
        if(worker!=null) {
            worker.work();
        }
        
    }
}

该方法仍然存在问题:通过类名创建对象时,需要传入完整的包名和类名。有哪些类可以被创建也并不直观。

3.下面我们看看使用反射机制并结合属性配置文件的方法(IOC)应该怎么写:

首先是属性配置文件,一般以xxx.properties的格式命名,此处为worker.properies

coder=worker.Coder
leader=worker.Leader

然后是主类的编写

interface Worker {
    public abstract void work();
}

class Coder implements Worker {
    public void work() {
        System.out.println("I am coding.");
    }
}

class Leader implements Worker {
    public void work() {
        System.out.println("I am talking.");
    }
}

// 操作属性文件类
class init{
    public static Properties getPro() throws FileNotFoundException, IOException{
        Properties pro=new Properties();
        File f=new File("worker.properties");
        if(f.exists()){
            pro.load(new FileInputStream(f));
        }else{
            pro.setProperty("coder", "worker.Coder");
            pro.setProperty("leader", "worker.Leader");
            pro.store(new FileOutputStream(f), "WORKER CLASS");
        }
        return pro;
    }
}

// 构造工厂
class Factory{
    public static Worker getInstance(String ClassName) {
        Worker worker = null;
        try{
            worker = (Worker)Class.forName(ClassName).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return worker;
    }
}

// 测试类
class Test {
    public static void main(String args[]){
        Properties pro=init.getPro();
        Worker worker = Factory.getInstance(pro.getProperty("coder")); // 
        if(worker!=null) {
            worker.work();
        }
        
    }
}

把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言提供的反射机制,根据配置文件中给出的类名生成相应的对象。

相关文章

  • spring学习总结(一) 反射

    spring的两大核心是IOC(控制反转)和AOP(面向切编程),首先我们先研究下什么是反射。 反射 在传统的开发...

  • Spring Framework学习(01)总结

    内容概览 Spring 学习讨论 Spring 项目 Spring 学习顺序 总结 1. Spring 学习讨论 ...

  • Java反射

    最近在研究spring框架,而spring的ioc是基于反射机制来完成的,因此先来学习下反射 使用场景当我们的程序...

  • Java 反射 reflection

    spring源代码,其基本原理如依赖注入、aop、以及xml技术,动态反射机制 Reflection 学习反射原理...

  • Spring框架之IOC的基本配置

    前言 上一章我们学习了Spring的IOC特性以及IOC的实现原理:注解和反射,本章我们将学习如何在Spring中...

  • Spring(3)——AOP

    Spring学习总结——Spring实现AOP的多种方式

  • java的反射机制

    最近在学习spring框架的原理,其中运用到了大量的反射机制(反射是框架设计的灵魂),下面就介绍下关于反射机制的使...

  • Spring简介----概念

    前言:最近学习了Spring框架,就此总结下心得体会 一. Spring简介: 什么是Spring?Spring是...

  • java基础之反射机制,学习spring框架进阶必学!

    理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底...

  • java反射实例

    理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底...

网友评论

      本文标题:spring学习总结(一) 反射

      本文链接:https://www.haomeiwen.com/subject/qghzsqtx.html