我遇到了一个奇怪的问题。我有一个接口,它的实现往往是无状态的。所以,我希望他们成为单身人士。如何从类名字符串中获取单例实例作为字符串
我得到的实现类名字符串。例如
String clazz = "com.foo.Bar";
我有一个规则工厂来获得IRule
实现的实例。
public class RulesFactory {
private static final Logger logger = LoggerFactory.getLogger(RulesFactory.class);
@SuppressWarnings("unchecked")
public static <T extends IRule> T getRuleInstance(String clazz) {
try {
Class<?> ruleObject = Class.forName(clazz);
Method factoryMethod = ruleObject.getMethod("getInstance");
return (T) factoryMethod.invoke(null);
} catch (ClassNotFoundException e) {
logger.error("ClassNotFoundException", e);
} catch (IllegalAccessException e) {
logger.error("IllegalAccessException", e);
} catch (SecurityException e) {
logger.error("SecurityException", e);
} catch (NoSuchMethodException e) {
logger.error("NoSuchMethodException", e);
} catch (IllegalArgumentException e) {
logger.error("IllegalArgumentException", e);
} catch (InvocationTargetException e) {
logger.error("InvocationTargetException", e);
}
return null;
}
}
上面代码抛出NullPointerException
如果该类不具有静态getInstance()
方法。在Java 6中,我不能在接口中使用静态方法。我不想创建IRule
实现的多个实例。如果我可以强制执行一个静态方法并调用该静态方法,我将获得兑现实例。但我无法做到这一点。如何解决这个问题呢?
另一个想法:有保护构造函数包的实现。将它们放在与RulesFactory相同的包中,然后基于clazz使用“new”创建实现,并按类名称将其存储在映射中。在创建新实例前始终检查地图。 – Blitzkr1eg 2014-12-04 07:44:22
如果**方法是静态的,则Null是传递调用**的有效值。所以检查你的'getInstance()'方法。 – Kayaman 2014-12-04 07:45:14
@Kayaman是的。这是有效的。但是,如何强制getInstance被客户端实现,也是静态方法? – phoenix 2014-12-04 07:46:41