对java反射创建的对象强制执行java接口

时间:2013-12-11 00:01:19

标签: java

  • 我从配置文件中读取了一个完整的类名
    • 例如:org.a.b.c.DefaultHandler
  • 此类实现一个名为“handler”
  • 的方法
  • 我使用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反射调用/创建的类的实例上强制实现接口????

3 个答案:

答案 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,你可以妥善处理。