有没有办法将字符串转换为类名,以便像上面的代码一样使用(我尝试使用Class.forName,但它不起作用)
Class c = Class.forName("SportCar");
c car= new c();
System.out.println(car.getCost());
答案 0 :(得分:3)
您可以使用:
Class<?> clazz = Class.forName(className);
Car car = (Car) clazz.newInstance();
如果在类中有一些参数化构造函数,那么执行类似
的操作Class<?> clazz = Class.forName(className);
clazz.newInstance();
Constructor<?> constructor = clazz.getConstructor(String.class);
Car object = (Car) constructor.newInstance(new Object[] { someArgument}); // constructor args
答案 1 :(得分:2)
您需要拨打Class<SportCar> c = (Class<SportCar>) Class.forName("package.to.SoprtCar");
SportCar car = c.newInstance();
System.out.println(car);
方法:
{{1}}
答案 2 :(得分:0)
Getting Class type from String
使用for Name Methdo
时,请确保您拥有类似com.mycompany.MyClass的完整类名答案 3 :(得分:0)
您可以创建一个类名为SportCar
的对象。虽然使用反射创建对象是一种非常昂贵的方式。
实际上你想使用SportCar
的某些功能,即方法getCost
。
interface Costly { BigDecimal getCost(); }
class SportCar implements Costly { ... }
Class c = Class.forName("SportCar");
Costly car= (Costly) c.newInstance();
System.out.println(car.getCost());
对于几个不同的用例,有更好的,更少人工的代码模式。
这里可以使用工厂模式来接收SportCar(或Costly)。 对于可扩展性,如果添加了一个或多个仍然未知类的库的应用程序接收到某个接口的实现类,则可以使用java SPI(服务提供者接口)