0

在我的应用程序中,使用了以下代码。有人可以对突出显示的代码进行详细解释吗?

我知道在第一个突出显示的块中,java反射用于调用方法handle_validation..但需要详细解释。

然后在第二个突出显示的块中抛出 RemoteException ..

我的确切问题是为什么他们使用反射来调用 EngineHandlerIF,然后为什么他们在这个 EngineHandlerIF 中使用 RMI 来调用 EngineHandler 中的方法定义?

private static EngineHandlerIF init() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] { "validation.xml" });
        String[] beans = ctx.getBeanDefinitionNames();
        for (String string : beans) {
            logger.info(string);
        }
        EngineHandlerIF engine = (EngineHandlerIF) ctx.getBean("engine");
        return engine;
    }



private Object callEngineMethod(MiddlewareMessage mmsg) {
        Object resultObj;
        try {
            **String methodName = "handle_validation";
            Method method = EngineHandlerIF.class.getDeclaredMethod(methodName, MiddlewareMessage.class);
            method.setAccessible(true);
            resultObj = method.invoke(engine, new Object[] { mmsg });**
        } catch (Exception e) {
            logger.error("sendMessage Exception: ", e);
            return new Boolean(false);
        }
        return resultObj;
    }

EngineHandlerIF:
----------------
**public abstract String handle_validation(MiddlewareMessage mmsg) throws RemoteException;**

EngineHandler:
--------------
public String handle_validation(MiddlewareMessage mmsg) throws Exception {
//some code
    }
4

2 回答 2

0

我知道在第一个突出显示的块中,java反射用于调用方法handle_validation..但需要详细解释。

差不多就是这样。唯一的另一位是

 method.setAccessible(true);

这使得调用者可以访问该方法(例如从私有到公共),从而允许您调用它。但是,上述方法似乎已经公开。也许这是重构后的一些遗产?

请注意,这不是RMI(远程方法调用),而是反射。我在这里看到的唯一 RMI 是handle_validation()可能抛出RemoteException.

于 2012-09-10T09:44:01.957 回答
0

也许有人刚刚发现了反思的锤子,所以一切,包括已经公开的方法,都开始看起来像个疯子。

这是垃圾:扔掉。直接调用方法即可。

于 2012-09-10T09:47:19.630 回答