2013-12-11 82 views
4
  • ,我读了配置文件的完整的类名
    • 如:org.abcDefaultHandler
  • 这个类实现了一个名为“处理程序”
  • 方法
  • 我用Java反射来调用 “处理程序”执行被Java反射创建的对象的Java接口

    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

我不明白你的问题。 )像这样'handlerObj = cls.newInstance(创建的对象;'不大于像'新org.a.b.c.DefaultHandler()'在您的示例创建的对象不同。 –

+1

由于反射,自然和定义,运行时工具,我不相信你可以强制执行相关的类定义,这是一个编译时需要什么。 – afsantos

回答

3

你不能这样做在编译时强制执行,这是一个handlerInterface什么,因为反射本质上是一个运行时的活动。

你能做的最好的就是投它作为你的接口handlerInterface。如果不是,则会抛出ClassCastException,您可以正确处理。

try { 
    handlerInterface handler = (handlerInterface) handlerObj; 
} catch (ClassCastException e) { 
    // Handle appropriately 
} 
+0

感谢澄清。 – GJain

1

检查方法签名;该代码(可以理解)没有检查太多:通常会打电话给getConstructor().newInstance(),例如,可能的例外情况。

如果有一个接口,这样做:

if (!HandlerInterface.class.isAssignableFrom(cls)) { 
    // Error 
} 
1

你可以使用泛型做:

Class<handlerInterface> cls = Class.forName("org.a.b.c.DefaultHandler"); 
handlerInterface handlerObj = cls.newInstance(); 

与投ClassCastException最后一行,如果它不implements handlerInterface,你可以适当的处理。