获取未知类的java bean的属性

时间:2009-01-27 16:05:47

标签: java javabeans

我希望能够在具有该方法的对象上调用“getProgram”,而不知道它们属于哪个类。我知道我应该在这里使用一个接口,但是我正在使用别人的代码而无法重新设计我正在使用的类。我以为BeanUtils.getProperty可能会帮助我,但它似乎只返回字符串。是否有类似Beanutils.getProperty的东西会返回一个可投射的对象?或者另一种更聪明的方式来处理两个不共享接口的类似类? 谢谢, -Morgan

7 个答案:

答案 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!");
    }
}