嗨,我正在制作一个接收字符串作为输入的程序,并基于该字符串创建一个类的实例。
问题是我的程序将来可能有新的类,我希望当这种情况发生时我不必对我的代码进行太多更改,所以我想避免使用 if 或 switch 链。
例如,如果我收到“Class1”作为输入,我想创建该类的一个实例
但是如果将来我希望能够创建“Class2”的实例,我不想通过在开关上添加新的 if 或新案例来更改以前的代码。
有没有办法做到这一点?
您需要使用反射 API。
你的字符串也会有包的完整路径
String yourClassPathPackage = "com.your.class.path.YourClass";
YourClass = (YourClass) Class.forName(yourClassPathPackage).newInstance();
Class.forName(classNameReceivedAsParameter).newInstance();
您需要将包名连接到参数以获得完整的类名。而且,显然,这仅适用于具有无参数构造函数的类。
您可以使用类的 forName 函数。解决方案在这里描述:“Class.forName()”和“Class.forName().newInstance()”有什么区别?
如前所述,您可以使用反射 API:
String yourClassPathPackage = "com.your.class.path.YourClass"
YourClass = (YourClass) Class.forName(yourClassPathPackage).newInstance();
但是,如果您在构造函数中有参数,您可以使用 get Constructor 方法来获取具有正确参数的构造函数:
Class.forName(yourClassPathPackage).getConstructor(String.class).newInstance("MyClass");