Java反射机制

强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

简述

Spring Ioc的原理是工厂+反射,所谓IOC即是控制反转,控制反转是一种思想,一个类想要完成一个功能,非常常见的是需要和其他对象进行合作完成,例如,分层系统中,service层调用dao层,则需要在service层new出一个dao层对象,接着使用,这种是较强的依赖管理,耦合强,一旦dao层做了更改,使用到dao层对象的都需要跟着改动,还有一种情况是多态中的使用,例如有一个水果接口,有苹果类和梨类实现这个接口,想要获得对应的水果对象时使用简单工厂获得,当多了一种水果时,就要修改工厂代码,引入反射机制,就可以动态的获得对象。

反射

##什么是反射   在运行期动态的获取任一类的所有属性及方法的能力 ##获取字节码的三种方式   Java中用于描述字节码的类就是Class类,拿到字节码文件就可以获取文件中的所有内容,所以想要使用反射就需要先获取字节码,三种方式如下:   ``` //第一种 Person p = new Person(); Class clazz = p.getClass(); //第二种 Class clazz = Person.class; //第三种 String className = "cn.itcast.bean.Person"; 54. Class clazz = Class.forName(className); ```

##使用简单工厂,未使用反射时:
1.创建fruit接口:

public interface fruit {
    public abstract void eat();
}

2.创建Apple类实现fruit接口

public class Apple implements fruit{
    public void eat() {
        System.out.println("Apple");
    }
}

3.创建Orange类实现接口

public class Orange implements fruit {
    public void eat() {
        System.out.println("Orange");
    }
}

4.创建工厂类

public class Factory {
    public static fruit getInstance(String fruitName){
        fruit f=null;
        //未使用工厂时
        if("Apple".equals(fruitName)){
            f=new Apple();
        }
        if("Orange".equals(fruitName)){
            f=new Orange();
        }
        return f;
    }
}

5.新建一个测试类,获取Apple对象

public class hello {
    public static void main(String[] a){
        fruit f=Factory.getInstance("Apple");
        f.eat();
    }
}

该种方法的缺点:当新添加一种水果类时,需要修改工厂方法添加一种逻辑,扩展性和了灵活性不强。
##使用简单工厂+反射
1.将工厂方法修改为

public class Factory {
    public static fruit getInstance(String ClassName){
        fruit f=null;
        try{
            f=(fruit)Class.forName(ClassName).newInstance();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}

2.修改测试类:

public class hello {
    public static void main(String[] a){
        fruit f=Factory.getInstance("zh.spring.ioc.Apple");
        f.eat();
    }
}

这种情况下,可灵活的添加一种水果类,缺点是需要开发人员使用时记清楚全路径,因此可以借助配置文件定义全路径对应的别名,利用开发使用。

总结

1.通过上述例子已经能体会到反射的优点:灵活,能够动态获取 2.除了以上一种应用场景,还有场景可以使用,例如使用aop拦截日志时,需要动态的获取执行方法的方法名,参数,返回值等等内容.同样可以使用反射实现。

你可能感兴趣的:(❀项目实战,------JAVA)