我正在研究java,在运行时我得到了类名,但我想为该类创建对象。我该如何做到这一点?任何人都可以帮助我。我尝试了以下方式,请检查下面的代码。
String emp = "Emp" // this is the classname i got in runtime(I will get dynamical this name)
Object obj = class.forName().newInstance();
到目前为止,它运行得很好,但我在上面的代码中得到了java.lang.Object。我不想要那个对象,我想把那个对象转换成我的className(Emp)对象。像
Emp e =(Emp)obj;
注意:我不确定每次我都会在运行时获得Emp类名。我的项目中总共有100个类,所以我会在这里获得任何类名(如Emp、Department、Student…)。
也许我不理解你的问题,但如果你想只使用类名创建一个类实例,你可以尝试这种方法:
public static MyClass getFromString(String myClassName) {
Object result = null;
MyClass final_result = null;
try{
result = Class.forName(myClassName).getConstructor().newInstance();
final_result= (MyClass)result;
}catch(ClassNotFoundException e){} //you must specify concrete Exception here
return final_result;
}
希望能有所帮助。
目前还不清楚您想要实现什么。如果您确信动态加载的类是Emp
(或其子类),那么像在问题中那样执行类型转换就足够了。如果您怀疑动态加载的类型是否与Emp
兼容,因为您有一百个其他类,那么您对我们的期望是什么还不清楚
您可以做的是将类型检查与实例化分离,例如
Class<? extends Emp> type = Class.forName(className).asSubclass(Emp.class);
Emp instance = type.newInstance();
这检查第一行中的类型是否与Emp
兼容,从而保证第二行返回Emp
的实例。
但是,报告不兼容类型的方式不会改变。它将通过抛出ClassCastException
来完成。
如果这不是你想要的,你应该重新写下你的问题。
Object object=Class.forName(className).getConstructor().newInstance();
// Complete class name, including Package
String name = "com.foo.Emp";
Object object = Class.forName(name).getConstructor().newInstance();
if (object instanceof Emp) {
// Specific logic for Emp objects
} else if (object instanceof Dept) {
// Specific logic for Dept objects
}
希望它能帮助你