我使用java反射来调用“handler”
Class cls = Class.forName("org.a.b.c.DefaultHandler");
handlerObj = cls.newInstance();
method = cls.getMethod("handler", cArg);
method.invoke(handlerObj, service);
类看起来像:
public class DefaultHandler {
public void handler(String service) throws Exception {
...
}
}
我需要确保所有*Handler Class
实现"handler"
方法。如果我做了像
public class DefaultHandler implements handlerInterface {
...
}
由于我使用反射,因此编译器无法提供帮助。
那么如何在java反射调用/创建的类的实例上强制实现接口????
答案 0 :(得分:3)
在编译时你不能做任何事情来强制它是handlerInterface
,因为反射本质上是一个运行时活动。
您可以做的最好的事情是将其作为界面handlerInterface
。如果不是,那么将抛出ClassCastException
,您可以适当地处理。
try {
handlerInterface handler = (handlerInterface) handlerObj;
} catch (ClassCastException e) {
// Handle appropriately
}
答案 1 :(得分:1)
检查方法签名;代码(可以理解)没有检查太多:例如,通常可以调用getConstructor().newInstance()
来查找可能的异常。
如果有界面,请执行:
if (!HandlerInterface.class.isAssignableFrom(cls)) {
// Error
}
答案 2 :(得分:1)
你可以使用泛型:
Class<handlerInterface> cls = Class.forName("org.a.b.c.DefaultHandler");
handlerInterface handlerObj = cls.newInstance();
抛出ClassCastException
的最后一行,如果它不是implements handlerInterface
,你可以妥善处理。