如何在java中的运行时使用类名来获取类Object



我正在研究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
  }

希望它能帮助你

相关内容

  • 没有找到相关文章

最新更新