我希望能够在具有该方法的对象上调用“getProgram”,而不知道它们属于哪个类。我知道我应该在这里使用一个接口,但是我正在使用别人的代码而无法重新设计我正在使用的类。我以为BeanUtils.getProperty可能会帮助我,但它似乎只返回字符串。是否有类似Beanutils.getProperty的东西会返回一个可投射的对象?或者另一种更聪明的方式来处理两个不共享接口的类似类? 谢谢, -Morgan
答案 0 :(得分:5)
使用PropertyUtils(来自apache commons-beanutils)而不是BeanUtils。
它有一个getProperty(Object bean,String name)方法,它返回一个Object而不是String。
有关详细信息,请参阅JavaDoc。
答案 1 :(得分:2)
只需使用反射...以下示例说明如何在没有公共接口的对象上执行此操作。
public static void main(String[] args) throws Exception {
doSomething(new A());
doSomething(new B());
}
private static void doSomething(Object object) throws Exception {
Method m = object.getClass().getMethod("doSomething", (Class[])null);
m.invoke(object, (Object[])null);
}
private static class A {
public void doSomething() {
System.out.println("I'm doing it already!");
}
}
private static class B {
public void doSomething() {
System.out.println("I'm doing it too!");
}
}
答案 2 :(得分:0)
请参阅Reflection API:
使用Class.getMethod()(或getMethods())查找适当的方法并调用它。
答案 3 :(得分:0)
据推测,您实现此方法的类数量有限,您可以直接链接到它们。所以你不需要反思。反思是邪恶的。
假设您有一组使用该方法的类:
public class LibA { public Program getProgram() { return program; } ... };
public class LibB { public Program getProgram() { return program; } ... };
...
然后你只需要instanceof / cast对。你可以将它放在一个方法中,这样你只需要做一次。
public static Program getProgram(Object obj) {
if (obj instanceof LibA) {
return ((LibA)obj).getProgram();
} else if (obj instanceof LibB) {
return ((LibB)obj).getProgram();
} else {
throw new IllegalArgumentException(obj+" doesn't have a known getProgram");
// Or an appropriate application exception.
}
}
或者您可能想要使用适配器:
public interface ProgramContainer {
Program getProgram();
...
}
public class LibAContainer implements ProgramContainer {
private final LibA libA;
public LibAContainer(LibA libA) {
this.libA = libA;
}
public Program getProgram() {
return libA.getProgram();
}
...
}
答案 4 :(得分:0)
一个非常简单的解决方案:使用实现接口的委托:
interface GetProgram
{
String getProgram ();
}
class AWrapper implements GetProgram
{
A a;
public AWrapper (A a) { this.a = a;
String getProgram () { return a.getProgram(); }
}
现在,您可以在代码中使用该界面,而无需触及原始类。
缺点:如果您创建的A位于您无法触及的范围之外,则效果不佳。如果A在您的控制下创建一次并且您可以立即包装它,则效果最佳。
答案 5 :(得分:0)
如果你有Java 5 +
,则会略短一些public static void main(String[] args) throws Exception {
System.out.println(invoke("toString", new A());
System.out.println(invoke("toString", new B());
}
private static <R> R invoke(Object object, String methodName) throws Exception {
return (R) object.getClass().getMethod(methodName).invoke(object);
}
答案 6 :(得分:-1)
java.beans.Expression就会这样做。
public static void main(String[] args) throws Exception {
new Expression(new A(), "doSomething", null).getValue();
new Expression(new B(), "doSomething", null).getValue();
}
public static class A {
public void doSomething() {
System.out.println("I'm doing it already!");
}
}
public static class B {
public void doSomething() {
System.out.println("I'm doing it too!");
}
}