2

这是非常糟糕的 OO,但我并不想将其放入任何类型的代码中,除了编码人员自己之外,任何人都可以使用它——除非编码人员进行测试,否则永远不能调用它。

这是我面临的问题:我有一系列外部定义的类。我不能以任何方式修改它们(当然我可以继承或调用它们)。它们有多种名称,但它们不扩展任何超类(Object 除外)或实现任何接口。然而,我对他们每个人的了解是他们有一个名为“调用”的方法。

为了测试,我正在尝试编写将调用这些类的任何一种调用方法的代码。但是,当然,我不能只说 Object.call(),因为调用不是为每个对象定义的。

本质上,这将起作用:

MyClassOne classOne = new MyClassOne();
MyClassOneInput classOneInput = new MyclassOneInput();

classOne.call(classOneInput);

但这不会:

Object clazz = getClassFromElsewhere();
Object clazzInput = getClassInputFromElsewhere();

clazz.call(clazzInput).

显然,由于 Java 是一种强类型语言。

但是,为了让在这个系统上工作的每个人的测试速度提高 10 倍,我能否以某种方式解决这个问题,并以某种方式对任何 Class 和任何 ClassInput 使用“调用”方法?如果传递了错误的类,如果它产生异常或完全中断,我没有问题。

请帮助我违反面向对象。

4

3 回答 3

8

您可以使用反射来执行此操作。查看反射 API

这是一个简单的例子:

MyClassOne classOne = new MyClassOne();
MyClassOneInput classOneInput = new MyClassOneInput();
Method m = classOne.getClass().getMethod("call", MyClassOneInput.class);
m.invoke(classOne, classOneInput);

注意:您可以使用getDeclaredMethod获取任何方法,包括私有和受保护的方法,但如果它们是私有/受保护的,则需要对它们调用“m.setAccessible(true)”。

于 2012-05-16T21:34:14.157 回答
6

这是Java 反射的完美使用。这是一个伪代码示例,但它看起来像这样

 Object obj = getExternalObject();
 Method meth = obj.getClass().getDeclaredMethod("call");
 meth.invoke(obj);
于 2012-05-16T21:33:05.203 回答
3

使用反射

  1. 使用getClass()
  2. 使用找到“调用”方法getMethod()
  3. 如果找到,在对象上调用它

例如

java.lang.reflect.Method method;
try {
  method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) {
  // ...
} catch (NoSuchMethodException e) {
  // ...
}

然后

try {
  method.invoke(obj, arg1, arg2,...);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {

请参阅将方法名称作为字符串给出时如何调用 Java 方法?

我还会考虑研究动态 JVM 语言(JRuby、Jython、Groovy),其中做这样的事情可能看起来不那么“糟糕的 OO”,感觉更自然

于 2012-05-16T21:32:26.310 回答