Java反射机制与应用

总结

  • Java的反射机制提供了运行时分析处理类的能力。
  • Spring框架的IOC容器使用了反射技术,可以简化代码编写。
  • 使用Spring+策略模式可以解决代码中if或switch代码块的代码耦合问题。

概述

反射机制提供的功能:

  • 在运行时判断任意一个对象所属的类
  • 在运行的时候构造任意一个类的对象
  • 在运行时判断一个类所具有的成员变量和方法
  • 在运行时调用任何一个对象的方法
  • 生成动态代理

反射机制

Java反射机制类

java.lang.Class; //类
java.lang.reflect.Constructor;//构造方法
java.lang.reflect.Field; //类的成员变量
java.lang.reflect.Method;//类的方法
java.lang.reflect.Modifier;//访问权限

优点和缺点

  • 优点:运行期类型的判断,动态类加载,动态代理使用反射。
  • 缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。

反射机制的应用场景

  • 逆向代码 ,例如反编译
  • 与注解相结合的框架 例如Retrofit
  • 单纯的反射机制应用框架 例如EventBus 2.x
  • 动态生成类框架 例如Gson

反射机制的应用

Spring框架的IOC

IOC中最基本的技术就是“反射(Reflection)”编程,,通俗来讲就是根据给出的类名(字符串方式)来动态地生成对象,这种编程方式可以让对象在生成时才决定到底是哪一种对象。只是在Spring中要生产的对象都在配置文件中给出定义,目的就是提高灵活性和可维护性。

我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

Spring反射的策略模式

如果不是用设计模式来做的情况下,会出现很多个 if-else 或者 switch 语句块。这样的话,代码耦合性也会非常高,将来再增加一个需求,则会导致一直增加判断语句块。也违反了面向对象的开闭原则。耦合性也会非常高,将来再增加一个需求,则会导致一直增加判断语句块。也违反了面向对象的开闭原则。反射+策略模式解决代码中if或switch代码块的代码耦合问题。

@Component
public class MyStragtrgyReflexContent implements ApplicationContextAware,InitializingBean {
    private Map<String,MyStragtegy> beanMap ;
    private ApplicationContext applicationContext;
    /**
     * 实现ApplicationContextAware接口,Spring容器会在创建MyStragtrgyReflexContent类之后,
     * 自动调用实现接口的setApplicationContextAware()方法,
     * 调用该方法时,会将ApplicationContext(容器本身)作为参数传给该方法,
     * 我们可以在该方法中将Spring传入的参数ApplicationContext赋给MyStragtrgyReflexContent对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身。
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    /**
     * 实现InitializingBean接口,该接口提供了afterPropertiesSet方法。
     * spirng容器在初始化bean的时候会执行afterPropertiesSet方法,
     * 我们可以在该方法中调用applicationContext接口提供的getBeansOfType方法获得实现MyStragtegy类的Bean,将之存储至map集合中
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        Map<String,MyStragtegy> map = applicationContext.getBeansOfType(MyStragtegy.class);
        this.beanMap = map;
    }
    public MyStragtegy getMyStragtegy(String beanName){
        return this.beanMap.get(beanName);
    }
}
@Service
public class StragtegyReflexService {

    @Autowired
    private MyStragtrgyReflexContent reflexContent;

    public String play(String type){
        MyStragtegy myStragtegy = reflexContent.getMyStragtegy(type);
        if (myStragtegy!=null){
            return myStragtegy.play();
        }else {
            return "还没有这个宠物哟!~";
        }
    }

}

参考

posted @ 2023-03-08 15:14  落叶微风  阅读(5)  评论(0编辑  收藏  举报  来源