-1

我有以下代码:

for(President obj : SomeClass.SomeObject(President.class))
{
    System.out.println(obj.getFullText());
}

在这里,有各种各样的类,实际上是一个巨大的列表,例如总统、汽车、火车、产品、男性姓名、女性姓名等。所有这些类都在其中包含方法 getFullText()。

现在,而不是写:

for(President obj : SomeClass.SomeObject(President.class))
{
    System.out.println(obj.getFullText());
}

for(Car obj : SomeClass.SomeObject(Car.class))
{
    System.out.println(obj.getFullText());
}

.. and so on

我想要一个通用的简短方法,它可以采用“President”、“Car”、“Product”等所有名称的字符串表示形式,然后在该特定类对象“obj”上调用此方法,以便在循环内我可以用这个方法的返回值做我想做的事。

4

2 回答 2

5

答案是使用反射。但这很复杂,如果你不小心,会导致各种微妙的问题。

最好的策略是重新考虑您的设计以避免需要这样做。一种选择是使用工厂模式

于 2013-01-06T12:54:05.573 回答
4

假设该类有一个没有任何参数的公共构造函数,并且被调用com.mydomain.app.Car,则以下加载该类并调用构造函数:

Class<?> clazz = Class.forName("com.mydomain.app.Car");
Car car = (Car) clazz.newInstance();

那叫反射。但是对于特殊类型的问题,应该很少使用它。您应该告诉我们您真正想要实现的目标,以便我们可以帮助您以更类型安全、OO 和高效的方式实现它。例如,您可以使用工厂模式:

public interface Drivable {
    public void drive();
}

public class Car implements Drivable {
    ...
}

public class Bus implements Drivable {
    ...
}

public class DrivableFactory {
    public static Drivable create(String kind) {
        if ("bus".equals(kind)) {
            return new Bus();
        }
        else if ("car".equals(kind)) {
            return new Car();
        }
        else {
            throw new ImmegalArgumentException("sorry, I can't create " + kind);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Drivable d = DrivableFactory.create(args[0]);
        d.drive();
    }
}
于 2013-01-06T12:55:45.907 回答