在Java中从字符串创建实例

20
如果我有两个类,“A”和“B”,我该如何创建一个通用工厂,以便只需将类名作为字符串传递即可接收实例?
例如:
public static void factory(String name) {
     // An example of an implmentation I would need, this obviously doesn't work
      return new name.CreateClass();
}

Thanks!

Joel

2个回答

25
Class c= Class.forName(className);
return c.getDeclaredConstructor().newInstance();//assuming you aren't worried about constructor .

用于调用带参数的构造函数

 public static Object createObject(Constructor constructor,
      Object[] arguments) {

    System.out.println("Constructor: " + constructor.toString());
    Object object = null;

    try {
      object = constructor.newInstance(arguments);
      System.out.println("Object: " + object.toString());
      return object;
    } catch (InstantiationException e) {
      //handle it
    } catch (IllegalAccessException e) {
      //handle it
    } catch (IllegalArgumentException e) {
      //handle it
    } catch (InvocationTargetException e) {
      //handle it
    }
    return object;
  }
}

点击这里查看相关IT技术内容。


如何向构造函数传递参数? - Joel
2
System.out.println(e);请不要这样做!为什么不直接声明异常呢?当你真的想通过报告来处理它时,请使用e.printStackTrace()。 - maaartinus
newInstance()现已被弃用,替换为clazz.getDeclaredConstructor().newInstance()。 - boardtc

5

您可以查看反射相关内容:

import java.awt.Rectangle;

public class SampleNoArg {

   public static void main(String[] args) {
      Rectangle r = (Rectangle) createObject("java.awt.Rectangle");
      System.out.println(r.toString());
   }

   static Object createObject(String className) {
      Object object = null;
      try {
          Class classDefinition = Class.forName(className);
          object = classDefinition.newInstance();
      } catch (InstantiationException e) {
          System.out.println(e);
      } catch (IllegalAccessException e) {
          System.out.println(e);
      } catch (ClassNotFoundException e) {
          System.out.println(e);
      }
      return object;
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接