Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以在Java中按名称实例化类?_Java_String_Object_Instantiation - Fatal编程技术网

有没有一种方法可以在Java中按名称实例化类?

有没有一种方法可以在Java中按名称实例化类?,java,string,object,instantiation,Java,String,Object,Instantiation,我想问的问题是:它描述了当类有名称时如何实例化类。有没有一种用Java实现的方法?我将拥有包名和类名,并且我需要能够创建具有该特定名称的对象。使用class.forName(“类的字符串名”).newInstance() Class.forName("A").newInstance(); 这将导致名为A的类被初始化。有两种方式: MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance(); 方法1-仅适用于具有无

我想问的问题是:它描述了当类有名称时如何实例化类。有没有一种用Java实现的方法?我将拥有包名和类名,并且我需要能够创建具有该特定名称的对象。

使用class.forName(“类的字符串名”).newInstance()

Class.forName("A").newInstance();
这将导致名为A的类被初始化。

有两种方式:

MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
方法1-仅适用于具有无参数构造函数的类 如果您的类具有无参数构造函数,则可以使用
class.forName()
获取
class
对象,并使用
newInstance()
方法创建实例(但请注意,此方法通常是因为它可以击败Java的检查异常)

例如:

Class<?> clazz = Class.forName("java.util.Date");
Object date = clazz.newInstance();
这两种方法都称为。您通常必须捕获可能发生的各种异常,包括:

  • JVM找不到或无法加载您的类
  • 您试图实例化的类没有正确类型的构造函数
  • 构造函数本身抛出了一个异常
  • 您试图调用的构造函数不是公共的
  • 已安装安全管理器,正在防止发生反射

    • 像这样的东西应该可以

      String name = "Test2";//Name of the class
              Class myClass = Class.forName(name);
              Object o = myClass.newInstance();
      

      使用java反射

      创建新对象 构造函数的方法调用没有等价物,因为调用构造函数相当于创建一个新对象(最准确地说,创建一个新对象涉及内存分配和对象构造)。因此,与上一个例子最接近的等价物是:

      import java.lang.reflect.*;
      
         public class constructor2 {
            public constructor2()
            {
            }
      
            public constructor2(int a, int b)
            {
               System.out.println(
                 "a = " + a + " b = " + b);
            }
      
            public static void main(String args[])
            {
               try {
                 Class cls = Class.forName("constructor2");
                 Class partypes[] = new Class[2];
                  partypes[0] = Integer.TYPE;
                  partypes[1] = Integer.TYPE;
                  Constructor ct 
                    = cls.getConstructor(partypes);
                  Object arglist[] = new Object[2];
                  arglist[0] = new Integer(37);
                  arglist[1] = new Integer(47);
                  Object retobj = ct.newInstance(arglist);
               }
               catch (Throwable e) {
                  System.err.println(e);
               }
            }
         }
      
      它查找处理指定参数类型并调用它的构造函数,以创建对象的新实例。这种方法的价值在于它完全是动态的,在执行时而不是在编译时进行构造函数查找和调用。

      将解决您的问题

      Class class1 = Class.forName(ClassName);
      Object object1 = class1.newInstance();
      

      为了更容易获得类的完全限定名,以便使用
      class.forName(…)
      创建实例,可以使用
      class.getName()
      方法。比如:

      class ObjectMaker {
          // Constructor, fields, initialization, etc...
          public Object makeObject(Class<?> clazz) {
              Object o = null;
      
              try {
                  o = Class.forName(clazz.getName()).newInstance();
              } catch (ClassNotFoundException e) {
                  // There may be other exceptions to throw here, 
                  // but I'm writing this from memory.
                  e.printStackTrace();
              }
      
              return o;
          }
      }
      

      从Java8开始,直接使用
      newInstance()
      是不推荐的。您需要使用
      Class.getDeclaredConstructor(…).newInstance(…)
      和相应的异常。

      值得一提的是,如果类没有无参数构造函数(并且有其他构造函数),或者如果无参数构造函数不可访问,则此方法不起作用。我们实例化一个类,结果是一个对象(或:举例)。答案是肯定的,但我认为你应该问这是不是一个好主意。强大的力量(反思)带来巨大的责任,只有在你理解并考虑了后果后,你才应该使用它。对我来说,这不管用,即使包名已经预先准备好了(@Simon你能详细说明/给出关于安全管理器的指针吗?你不能简单地
      clazz.newInstance()
      而不是
      getName
      然后
      fromName
      Class class1 = Class.forName(ClassName);
      Object object1 = class1.newInstance();
      
      class ObjectMaker {
          // Constructor, fields, initialization, etc...
          public Object makeObject(Class<?> clazz) {
              Object o = null;
      
              try {
                  o = Class.forName(clazz.getName()).newInstance();
              } catch (ClassNotFoundException e) {
                  // There may be other exceptions to throw here, 
                  // but I'm writing this from memory.
                  e.printStackTrace();
              }
      
              return o;
          }
      }
      
      Data d = (Data) objectMaker.makeObject(Data.class);