string—有没有一种方法可以在java中通过名称示例化类?

xytpbqjk  于 2021-07-05  发布在  Java
关注(0)|答案(9)|浏览(422)

我的问题是:从字符串名示例化一个类,这个字符串名描述了如何示例化一个有名称的类。有没有一种方法可以用java来实现呢?我将有包名和类名,我需要能够创建一个具有特定名称的对象。

7vhp5slm

7vhp5slm1#

forname(“classname”)将解决您的问题。

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

vbopmzt12#

像这样的事情应该管用。。。

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

whhtz7ly3#

两种方式:

方法1-仅适用于没有参数构造函数的类

如果你的类有一个无参数构造函数,你可以得到一个 Class 对象使用 Class.forName() 使用 newInstance() 方法来创建一个示例(不过要注意,这个方法通常被认为是邪恶的,因为它可以击败java的检查异常)。
例如:

Class<?> clazz = Class.forName("java.util.Date");
Object date = clazz.newInstance();

方法2

如果类没有任何no-arg构造函数,另一种更安全的方法是查询类对象以获取其 Constructor 对象并调用 newInstance() 此对象上的方法:

Class<?> clazz = Class.forName("com.foo.MyClass");
Constructor<?> constructor = clazz.getConstructor(String.class, Integer.class);
Object instance = constructor.newInstance("stringparam", 42);

这两种方法都称为反射。通常,您必须捕获可能发生的各种异常,包括:
jvm找不到或无法加载您的类
您尝试示例化的类没有正确的构造函数类型
构造函数本身引发了一个异常
您尝试调用的构造函数不是公共的
已安装安全管理器,正在阻止发生反射

ztigrdn8

ztigrdn84#

使用class.forname(“类的字符串名称”).newinstance();

Class.forName("A").newInstance();

这将导致名为a的类被初始化。

x33g5p2x

x33g5p2x5#

MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();
iyfamqjs

iyfamqjs6#

使用 newInstance() 从Java8开始就不赞成直接使用。你需要使用 Class.getDeclaredConstructor(...).newInstance(...) 但也有相应的例外。

mf98qq94

mf98qq947#

使用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);
         }
      }
   }

它找到一个处理指定参数类型的构造函数并调用它,以创建对象的新示例。这种方法的价值在于它是纯动态的,在执行时进行构造函数查找和调用,而不是在编译时。

hgncfbus

hgncfbus8#

String str = (String)Class.forName("java.lang.String").newInstance();
rggaifut

rggaifut9#

更容易获得类的完全限定名,以便使用 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;
    }
}

然后你可以将你得到的对象投射回你传递给的任何类 makeObject(...) :

Data d = (Data) objectMaker.makeObject(Data.class);

相关问题