调用Class类型的对象的方法

时间:2015-03-19 09:42:21

标签: java class object methods

我会尝试尽可能简单地设置它,因为它也让我感到困惑。

我有一个方法返回Class类型的对象,即

public Class foo(){...}

当我称这种方法时,我将结果保存在Class类型的变量中,即

Class obj = new foo();

foo()可以返回许多不同的类,但它们都包含相同的方法bar()

如何从obj变量调用该方法?

我尝试了obj.bar(),但IDE似乎并不喜欢它。我得到了

  

错误:(59,34)错误:找不到符号方法bar()

3 个答案:

答案 0 :(得分:2)

您似乎想要对行为进行分组,这就是Java interfaces所做的:

interface Barer {
    String bar();
}

class Foo implements Barer {
    String bar() {
        return "I'm a Foo";
    }
}

class Fooz implements Barer {
    String bar() {
        return "I'm a Fooz";
    }
}

然后在你的代码中你可以有类似的东西:

Barer obj;

if (something) {
    obj = new Foo();
} else {
    obj = new Fooz();
}

obj.bar()

将构造函数的返回值存储在Class对象中实际上没有意义。


如果你确实需要一个Class对象(请记住它只指向Class,而不是指向你创建的实例),你可以使用Java reflection

Class obj = new foo();
Method method = obj.getDeclaredMethod("bar");
method.invoke(null);

答案 1 :(得分:1)

如果方法foo()返回Class,则意味着它不会返回你想要调用bar()方法的objet的实际实例,而是类本身,所以它不可能在Class.class上调用方法bar()没有方法栏。

在您的代码示例中存在一些错误

Class obj = new foo();

关键字 new 意味着您正在创建一个新的类实例,而不是您在对象上调用方法。


事实上,正确的方法是使用接口。

而不是从foo方法返回Class,声明一个接口,

public interface MyInterface {
  public void bar();
}

并使foo()返回MyInterface而不是Class。

然后你可以做

MyInterface obj = tmp.foo();
obj.bar()

答案 2 :(得分:0)

如果所有返回的值都是实现相同方法的类的对象,则应该在单独的接口中声明该方法并让它们实现它。稍后您可以使用通用通配符,例如<? extends BarInterface>或将返回类型更改为BarInterface

public interface BarInterface{
    public void bar();
}

public <T extends BarInterface> foo(){...}

public BarInterface foo() {...}