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

时间:2014-09-03 14:00:19

标签: java reflection

我正在研究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 classname总数我在myproject中有100个类,所以我会在这里找到任何类名(比如Emp,Dept,Student .... )。

4 个答案:

答案 0 :(得分:1)

也许我不理解您的问题,但如果您只想使用您的类名创建一个类实例,可以试试这个方法:

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; 
    }

希望它有所帮助。

答案 1 :(得分:0)

目前尚不清楚你想要实现的目标。如果您确信动态加载的类是Emp(或其子类),那么就像在问题中一样进行类型转换就足够了。如果您对与Emp兼容的动态加载类型有疑问,因为您拥有其他100个类,那么您对我们的期望并不清楚。

您可以做的是将类型检查与实例化分开,例如

Class<? extends Emp> type = Class.forName(className).asSubclass(Emp.class);

Emp instance = type.newInstance();

这将检查该类型是否与第一行中的Emp兼容,因此第二行保证返回Emp的实例。

但是,报告不兼容类型的方式不会改变。它将通过抛出ClassCastException来完成。

如果那不是您所要求的,那么您应该重新提出问题。

答案 2 :(得分:-1)

Object object=Class.forName(className).getConstructor().newInstance();

答案 3 :(得分:-1)

  // 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
  }

希望它可以帮到你