Java精髓是反射,反射的巨大威力在: 反射➕泛型,反射➕注解中显得淋漓尽致,非常的简约典雅,打造高可用的模式。
Annotation-新的开发技术结构。
- 根据实例对象找到所属类型,找到根源。
- 反射中所有的核心操作都是围绕Class类展开的。
- Class代表的对象有类,抽象类,接口,基本数据类型class(int.class)
获取指定Class的三种方式
- 通过对象实例获取Class,特点:是需要有对象实例。(获取实例对象的类的根源信息)
- JVM直接支持的**“类.class”**形式的实例化。
- Class类有一个静态方法forName来获取Class实例化,特点: 以字符串(为权限命名)的形式来获取指定的类型,不需要import该类来获得Class,解耦合,降低到了import级别。
对象反射实例化
通过反射获取实例化对象,newInstance;(反射世界中的newInstance相对于平常编写代码中的new)–newInstance 在jdk1.9之后被废除,原因是它只会调用无参构造函数。
工厂模式为接口实例化
工厂模式解耦合(子类与客户端的解耦)
静态工厂模式以字符串作为参数判断来返回指定的实例化对象,但是如果子类不断增多,那么每次都要修改静态工厂,原因是需要new,new 需要硬编码对象的名称。
public class StaticFactory {
/**
* 缺点:当有新的子类出现时需在这里手动添加修改代码
*/
public static IMessage getMessageInstance(String name){
IMessage instance = null;
if("NetMessage".equals(name)){
instance = new NetMessage();
}else if("CloudMessage".equals(name)){
instance = new CloudMessage();
}
return instance;
}
}
静态工厂场景模拟
public class Main {
public static void main(String[] args) {
IMessage msg = StaticFactory.getMessageInstance("NetMessage");
msg.message();
msg = StaticFactory.getMessageInstance("CloudMessage");
msg.message();
}
}
/**
【网络消息】:Hello :)
【云消息】:Hello :)
*/
动态工厂模式:newInstance的出现可以不用硬编码类名称,只需要根据客户端传入的权限命名字符串即可,在以后增加子类的过程中,完全不用修改动态工厂。
/**
* 动态工厂模式
*/
public class DynamicFactory {
public static IMessage getMessageInstance(String name){
IMessage instance = null;
try {
// 通过反射newInstance来获取实例化对象
instance = (IMessage) Class.forName(name).newInstance();
}catch(Exception e){}
return instance;
}
}
动态工厂场景模拟
public class Main {
public static void main(String[] args) {
// 注意这里传入的是权限命名
IMessage msg = DynamicFactory.getMessageInstance("org.hzz.NetMessage");
msg.message();
msg = DynamicFactory.getMessageInstance("org.hzz.CloudMessage");
msg.message();
}
}
/**
【网络消息】:Hello :)
【云消息】:Hello :)
*/
反射➕泛型
为不同的接口实例化
打造高可用的工厂模式
/**
* 高可用的工厂模式
*/
public class Factory {
/**
* 获取接口的实例化对象
* @param name 权限命名
* @param clazz 外部调用传入,用于泛型处理
* @param <T>
* @return
*/
public static<T> T getInstance(String name,Class<T> clazz){
T instance = null;
try{
instance = (T)Class.forName(name).newInstance();
}catch (Exception e){}
return instance;
}
}
高可用的工厂模式场景模拟
public class Main {
public static void main(String[] args) {
// 注意这里传入的是权限命名,以及Class,这里是接口的class
IMessage msg = Factory.getInstance("org.hzz.NetMessage",IMessage.class);
msg.message();
msg = Factory.getInstance("org.hzz.CloudMessage",IMessage.class);
msg.message();
IService srv = Factory.getInstance("org.hzz.HourseSerVice",IService.class);
srv.service();
srv = Factory.getInstance("org.hzz.CoffeeService",IService.class);
srv.service();
}
}
/**
【网络消息】:Hello :)
【云消息】:Hello :)
【租房服务】: Hello :)
【咖啡服务】: Hello :)
*/