24.3 类加载的应用:可配置的策略

24.3 类加载的应用:可配置的策略

可以通过ClassLoader的loadClass或Class.forName自己加载类,但什么情况需要自己加载类呢?很多应用使用面向接口的编程,接口具体的实现类可能有很多,适用于不同的场合,具体使用哪个实现类在配置文件中配置,通过更改配置,不用改变代码,就可以改变程序的行为,在设计模式中,这是一种策略模式。我们看个简单的示例,定义一个服务接口IService:

1
2
3
public interface IService {
public void action();
}

客户端通过该接口访问其方法,怎么获得IService实例呢?查看配置文件,根据配置的实现类,自己加载,使用反射创建实例对象,示例代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ConfigurableStrategyDemo {
public static IService createService() {
try {
Properties prop = new Properties();
String fileName = "data/c87/config.properties";
prop.load(new FileInputStream(fileName));
String className = prop.getProperty("service");
Class<? > cls = Class.forName(className);
return (IService) cls.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
IService service = createService();
service.action();
}
}

config.properties的内容示例为:

1
service=shuo.laoma.dynamic.c87.ServiceB

代码比较简单,就不赘述了。完整代码可参看https://github.com/swiftma/program-logic ,位于包shuo.laoma.dynamic.c87下。