如何创建一个可以存储不相关类对象的变量

时间:2017-11-17 10:23:34

标签: java reflection casting

我正在使用反射来调用不同类的方法,这些方法在功能方面是无关的,但在操作方面是相关的。因此,我必须传递这些类的对象来调用方法,但是如何将对象存储在同一个变量中呢?

Method target;
if (handlerType.equals("database")){
    target = DatabaseRequestHandler.class.getMethod(method, Args.class);
} else if (handlerType.equals("document")){
    target = DocumentRequestHandler.class.getMethod(method, Args.class);
} else if (handlerType.equals("dictionary")){
    target = DictionaryRequestHandler.class.getMethod(method, Args.class);
} else {
    throw new IllegalArgumentException("Handler not implemented for this call");
}
//Method target = RequestHandler.class.getMethod(method, Args.class);
if (target.getReturnType().equals(Void.TYPE)) {
    target.invoke(requestHandler, args);
} else {
    Object result = target.invoke(requestHandler, args);
    body = ValueSerializer.serialize(result, memory);
}

我应该如何声明requestHandler变量,以便我可以存储DatabaseHandler,DocumentHandler和DictionaryHandler的对象?所有这些类都没有相互关联,因此没有必要使用它们继承。我来自Python背景,所以真的不知道如何实现这一点。

2 个答案:

答案 0 :(得分:1)

Method.invoke接受Object要使用的实例。因此,您可以简单地声明Object或(更好)公共类/接口(如果可用)。

MyHandler requestHandler ...

Object requestHandler ....

仅供参考:

您应该重新考虑这个逻辑,我相信您应该能够使用ConsumerFunction删除反射来执行方法参考。

答案 1 :(得分:0)

我使用以下方法创建对象。

Object requestHandler = null;
Method target;
if (handlerType.equals("
    target = DatabaseRequestHandler.class.getMethod(method, Args.class);
    requestHandler = new DatabaseRequestHandler();
} else if (handlerType.equals("document")){
    target = DocumentRequestHandler.class.getMethod(method, Args.class);
    requestHandler = new 
} else if (handlerType.equals("dictionary")){
    target = DictionaryRequestHandler.class.getMethod(method, Args.class);
    requestHandler = new DictionaryRequestHandler();
} else {
    throw new IllegalArgumentException("Handler not implemented for this call");
}
if (target.getReturnType().equals(Void.TYPE)) {
    target.invoke(requestHandler, args);
} else {
    Object result = target.invoke(requestHandler, args);
    body = ValueSerializer.serialize(result, memory);
}