总结
- 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 "还没有这个宠物哟!~";
}
}
}
参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/221988.html