我有以下代码:
for(President obj : SomeClass.SomeObject(President.class))
{
System.out.println(obj.getFullText());
}
这里有各种类,实际上是一个巨大的列表,例如President,Car,Train,Product,MaleName,FemaleName等。所有这些类都有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”上调用此方法,以便在循环内部,我可以使用此方法的返回值执行我想要的操作。
答案 0 :(得分:5)
答案是使用reflection。但这很复杂,如果你不小心,会导致各种微妙的问题。
最好的政策是重新考虑您的设计,以避免需要这样做。一种选择是使用factory pattern。
答案 1 :(得分:4)
假设该类有一个没有任何参数的公共构造函数,并且被称为com.mydomain.app.Car
,那么下面将加载该类并调用构造函数:
Class<?> clazz = Class.forName("com.mydomain.app.Car");
Car car = (Car) clazz.newInstance();
这称为反射。但对于特殊类型的问题,它应该极少使用。您应该告诉我们您实际想要实现的目标,以便我们能够以更安全,更高效和更有效的方式帮助您实现这一目标。例如,您可以使用工厂模式:
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();
}
}